4

私は R で再帰関数を書いていますが、関数のインスタンスがいくつ呼び出されたかがわかるようにグローバル変数を変更したいと考えています。以下が機能しない理由がわかりません。

i <- 1

testfun <- function( depth= 0 ) {

  i <- i + 1
  cat( sprintf( "i= %d, depth= %d\n", i, depth ) )
  if( depth < 10 ) testfun( depth + 1 )
}

出力は次のとおりです。

i= 2, depth= 0
i= 2, depth= 1
i= 2, depth= 2
i= 2, depth= 3
i= 2, depth= 4
i= 2, depth= 5
i= 2, depth= 6
i= 2, depth= 7
i= 2, depth= 8
i= 2, depth= 9
i= 2, depth= 10

予想される出力は次のとおりです。

i=2, depth= 0
i=3, depth= 1
i=4, depth= 2
i=5, depth= 3
i=6, depth= 4
i=7, depth= 5
i=8, depth= 6
i=9, depth= 7
i=10, depth= 8
i=11, depth= 9
i=12, depth= 10
4

3 に答える 3

8

関数を使用localして同じことを行うことができますが、グローバル環境を変更する必要はありません。

testfun <- local({
  i <- 1
  function( depth= 0 ) {
    i <<- i + 1
    cat( sprintf( "i= %d, depth= %d\n", i, depth ) )
    if( depth < 10 ) testfun( depth + 1 )
  }
})

これは、保持するローカル環境でtestfun関数を非常にきれいにラップします。この方法は、CRAN にサブミットされたパッケージでは受け入れられるはずですが、グローバル環境の変更は受け入れられません。i

于 2013-05-10T11:46:28.550 に答える
6

わかりました、私はあまり明るくありません。答えは次のとおりです。

i <<- i + 1
于 2013-05-10T10:58:30.637 に答える
0

関数の引数として「i」を与えます。

于 2013-05-10T11:00:42.380 に答える