【发布时间】:2017-01-06 16:06:28
【问题描述】:
我只是想知道是否可以使用 apply 函数,以便在使用下一个 i 索引之前,刷新其中一个参数。让我介绍一个例子:
我有一个简单的 10 元素向量:
a<-c(1,rep(NA,9))
并定义一个函数,将 a 的第 i 个元素替换为 2 和前一个元素的总和:
fun<-function(i,vec){
vec[i]<-2+cumsum(vec)[i-1]
a<<-vec
}
现在我想使用 sapply,f.e.
sapply(2:10,fun,vec=a)
所以结果我得到向量1,3,...19。
我知道在 for 循环中很容易完成,但我会尝试申请看看它是否是更快的解决方案。
感谢您的任何建议!
巴特
【问题讨论】:
-
最好的解决方案总是矢量化:
1 + (0:9) * 2 -
有副作用的函数很危险
<<- -
当然矢量化是最好的,但真正的问题更复杂。我在以下步骤中添加的内容取决于之前的结果(之前填充的 a 值)——这里的示例很简单,只是为了展示这个想法
-
你不清楚你的向量
a的构成。例如。它的哪些属性是可变的(第一个值,任何值,长度)。对于您的示例,@Roland 显示了解决方案。 -
请提供一个具体且有代表性的例子。
*apply循环仍然是循环,并不比编写良好的for循环快(vapply稍有例外)。但是,如果您的问题是真正的递归问题,那么使用编译语言(即 Rcpp)通常是最简单和最好的。
标签: r loops dynamic arguments apply