あなたは、入力の値を変更するlapply()関数を使用することはできますか?

StackOverflow https://stackoverflow.com/questions/1559724

  •  21-09-2019
  •  | 
  •  

質問

私はそれに似た入力の値を変更するために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 
> 

任意のアイデア?

役に立ちましたか?

解決

<私>の編集:のあなたの明確化後:いいえ、私はあなたが再帰的にそのような何かを適用する機能を使用できることを信じていません。適用関数の全体のポイントは、それが同時にベクトル/行列を横切って適用されることである。

またhref="https://stackoverflow.com/questions/1478758/optimizing-the-computation-of-a-recursive-sequence">はstackoverflowの。

私の古い答え:

これを試してください:

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

しかし、それは反復を有していないので、最初のバージョンであることが好ましい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top