Альтернатива xrange Python для R ИЛИ как бездельничать в больших наборах данных?

Следующий пример основан наобсуждение об использованииexpand.grid с большими данными. Как видите, это заканчивается ошибкой. Я думаю, это связано с возможными комбинациями, которые в соответствии супомянутый страница 68,7 миллиардов:

> v1 <-  c(1:8)
> v2 <-  c(1:8)
> v3 <-  c(1:8)
> v4 <-  c(1:8)
> v5 <-  c(1:8)
> v6 <-  c(1:8)
> v7 <-  c(1:8)
> v8 <-  c(1:8)
> v9 <-  c(1:8)
> v10 <- c(1:8)
> v11 <- c(1:8)
> v12 <- c(1:8)
> expand.grid(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
Error in rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) : 
  invalid 'times' value
In addition: Warning message:
In rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
  NAs introduced by coercion to integer range

Даже с восемью векторами это убивает мой процессор и / или оперативную память (> expand.grid(v1, v2, v3, v4, v5, v6, v7, v8)).Вот Я нашел некоторые улучшения, которые предлагают использоватьouter или жеrep.int, Эти решения работают с двумя векторами, поэтому я не могу применить его для 12 векторов, но я думаю, что принцип тот же: он создает большую матрицу, которая находится в памяти. Мне интересно, есть ли что-то вроде питонаxrange который лениво оценивает?Вот я обнаружилdelayedAssign функция, но я думаю, это не поможет, потому что здесь также упоминается следующее:

К сожалению, R оценивает ленивые переменные, когда на них указывает структура данных, даже если их значение в данный момент не требуется. Это означает, что бесконечные структуры данных, одно из распространенных применений лени в Haskell, невозможны в R.

Является ли использование вложенных циклов единственным решением этой проблемы?

PS: У меня нет конкретной проблемы, но предположим, что вам нужно выполнить некоторые вычисления, используя функцию, которая по некоторым причинам принимает 12 целочисленных аргументов. Также предположим, что вам нужно составить все комбинации из этих 12 целых чисел и сохранить результаты в файл. Использование 12 вложенных циклов и непрерывное сохранение результатов в файл будет работать (несмотря на то, что это будет медленным, но это не убьет вашу оперативную память).Вот показано, как вы можете использоватьexpand.grid а такжеapply функция для замены двух вложенных циклов. Проблема в том, что для создания такой матрицы с 12 векторами длины 8 используютexpand.grid имеет некоторые недостатки:

генерация такой матрицы идет медленнотакая большая матрица занимает много памяти (68,7 миллиардов строк и 8 столбцов)дальнейшая итерация по этой матрице с помощьюapply тоже медленно

Так что, на мой взгляд, функциональный подход гораздо медленнее, чем процедурное решение. Мне просто интересно, можно ли лениво создать большую структуру данных, которая в теории не вписывается в память и перебирать ее. Это все.

Ответы на вопрос(2)

Ваш ответ на вопрос