【发布时间】:2015-07-12 15:45:18
【问题描述】:
我想以 sapply 的最新输出值成为 sapply 的下一个输入的方式使用 sapply。在下面的示例中,我创建了向量 a=(1, NA, NA, NA),并希望 sapply 返回向量 a=(1,1,2,2)。基本上,对于 a[2:4],我希望输出为 2-1=2, 3-1=2, 4=2=2
a <- NA
a[1] <- 1
a[2:4] <- sapply(2:4, function(x) x- a[x-1])
如果您运行它,您会看到它返回 a=(1,1,NA,NA),因为它使用现有的 a 向量而不是“实时”向量。
作为一个for循环,它的工作原理是这样的:
a <- NA
a[1] <- 1
for (ii in 2:4){
a[ii] <- ii-a[ii-1]
}
之所以要使用 sapply 是因为我的真实函数很复杂,而且会运行在大型数据集上,我不想等待很长时间。
谢谢。
【问题讨论】:
-
使用
sapply而不是编写良好的for循环,您不太可能显着提高速度。我不明白2-1=2, 3-1=2, 4=2=2 -
sapply不会这样做,即使可以,它也不会比编写良好、预先分配的for循环快得多。您的问题可能会被矢量化,但如果没有看到您的“真实”功能,就不可能知道。否则,对于强烈依赖于前一次迭代的计算,我强烈建议使用 Rcpp 来提高速度。 -
@docendo 对不起,这是一个错字。应该是 2-1=2、3-1=2、4-2=2。我意识到这不是很清楚。显示的循环覆盖了它。