В общем случае синтаксис x $ y < - f (z) должен перераспределять x каждый раз, что было бы очень медленным, если x - большой объект. Но, оказывается, R имеет некоторые трюки, так что функция замены списка [[<-
не перераспределяет весь список каждый раз. Так что я думаю, что вы можете достаточно эффективно сделать:
x[[1]] <- x1
for (m in seq(2, n))
x[[m]] <- f(x[[m-1]])
Единственным расточительным аспектом здесь является то, что вы должны сгенерировать массив длины п-1 для для цикла, который не является идеальным, но это, вероятно, не гигантский вопрос. Вы можете заменить его на цикл while, если хотите. Обычные приемы векторизации (lapply и т.д.) не будет работать здесь ...
(двойные скобки дают вам элемент списка, который является то, что вы, вероятно, хотите, а не одноточечного список.)
Для получения дополнительной информации см. Chambers (2008). Программное обеспечение для анализа данных. п. 473-474.
IS F (х) представима в виде комбинации cumsum() 'с, cumprod()' ы? –
Несколько комментариев: i) итерация, а не рекурсия здесь не экономит много времени; ii) кажется, что единственный способ ускорить дело - это код C, возможно, встроенный. Я надеялся, что будет пакет, который мог бы сделать работу для меня выразительным образом. Не тот случай. – gappy
Является ли проблема, что f() очень медленная или что n очень велико?Возможно, вы сможете внести улучшения в R, если это последний случай, но да, переписывание f() в C может быть необходимо, если это первый ... – Harlan