题
我想知道是否可以使用lapply()函数来改变输入的值,类似于:
a1<-runif(100)
a2<-function(i){
a1[i]<-a1[i-1]*a1[i];a1[i]
}
a3<-lapply(2:100,a2)
我在找一个类似的东西for()循环,但使用lapply()基础设施。我一直没能得到rapply()来做到这一点。
的原因是“真正的” A2功能是一个困难的功能只需要进行评估,如果的值A1 [I-1]符合一些标准。
重新措辞:所以我试图通过lapply替换为()在下面的代码() - 型的事:
a1<-runif(100)
a2<-function(i, a1){
a1[i]<-a1[i-1]*2
a1[i]
}
a3<-as.numeric(lapply(2:100, a2, a1=a1))
#compare the output of a3 with that of a1 after the recursive loop
a2<-a1 #saved for comparison
for(i in 2:length(a1)){
a1[i]<-a1[i-1]*2
}
cbind(a1[2:100],a3)
#actually this is would be like writting a lapply() version of the cumprod() function
cbind(a1,cumprod(a2))
将R邮件列表已告知仰望的减少()函数....如:
a1<-runif(100)
cadd<-function(x) Reduce("*", x, accumulate = TRUE)
cadd(a1)
其给出相同的结果cumprod(A1)...但比循环更慢:
a1<-runif(100000)
cadd<-function(x) Reduce("*", x, accumulate = TRUE)
looop<-function(a1){
j<-length(a1)
for(i in 2:j){
a1[i]<-a1[i-1]*a1[i]
}
a1
}
> system.time(cadd(a1))
user system elapsed
1.344 0.004 1.353
> system.time(cumprod(a1))
user system elapsed
0.004 0.000 0.002
> system.time(loop(a1))
user system elapsed
0.772 0.000 0.775
>
任何想法?
解决方案
编辑:的按照你的澄清:不,我不相信你可以使用一个应用功能做一些递归这样的。的应用功能的全部要点是,它适用于在整个向量/矩阵同时
您可能也想只看计算器一此相关的问题>
我的旧的答案:的
尝试这种情况:
a1<-runif(100)
a2<-function(i, a1){
a1[i]<-a1[i-1]*a1[i]
a1[i]
}
a3 <- as.numeric(lapply(2:100, a2, a1=a1))
不同于for
循环,就需要在到任何东西,你需要一个lapply
内的基准通过。返回也是一个列表,所以你需要将它转换回成任何你想要的形式。
您可能也想看看plyr包简便的方法,做这种事情。
除此之外,你可以做你的操作没有环:
a3 <- a1[-length(a1)] * a1[-1]
在换句话说,这些语句是完全等效的:
> all((a1[-length(a1)] * a1[-1]) == as.numeric(lapply(2:100, a2, a1=a1)))
[1] TRUE
但是,第一个版本是优选的,因为它没有迭代。
不隶属于 StackOverflow