次のように、 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] の値がいくつかの基準を満たしている場合にのみ評価する必要がある難しい関数だからです。
言い直し: だから私は以下のコードの for() を 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 メーリング リストは、Reduce() 関数を検討することを勧めています....次のように:
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
>
何か案が ?