1

Rには次のforループがあります:

v = c(1,2,3,4)
s = create.some.complex.object()
for (i in v){
   print(i)
   s = some.complex.function.that.updates.s(s)
}
# s here has the right content.

言うまでもなく、このループは R では非常に遅いです。関数型スタイルで記述しようとしました。

   lapply(v, function(i){
      print(i)
      s = some.complex.function.that.updates.s(s)
   })
   # s wasn't updated.

sしかし、参照ではなく値によって渡されるため、これは機能しません。すべての中間ステップではなく、最後の反復の結果のみが必要です。R スタイルで最初のループを作成するにはどうすればよいですか?

ムロン

4

3 に答える 3

1

何度も作成する余裕がない場合、多くのオプションはありません。あなたが操作しているオブジェクトを見ずに言うのも難しいです. オブジェクトが成長/追加している場合は、中間結果を収集し、最後に追加を行うことができます。実際に変化している場合は、パス値から離れて参照クラスを使用するようにしてください ( http://www.inside-r.org/r-doc/methods/ReferenceClasses )。次に、それを変更する関数は、実際には n 回呼び出すだけのメソッドになります。

于 2013-06-15T18:01:53.897 に答える
0

ループ自体が本当に問題なのですか? それとも、 some.complex.function.that.updates.s の実行に必要な時間ですか? 一部の R プログラマーは、ループを回避するためにフープをジャンプしますが、次の例を見てください。

f <- function(a) a/1.001
loop <- function(n) { s = (1/f(1)^n); for (i in 1:n) s <- f(s); s}
system.time(loop(1E7))
   user  system elapsed 
  7.011   0.030   7.008

これは、ループ内の非常に些細な関数の呼び出しごとに (MacBook Pro で) 0.7 マイクロ秒です。

于 2013-06-15T20:29:37.213 に答える