6

外部スコープで定義された変数を使用する無名関数のリストを定義しました。

funclist <- list()
for(i in 1:5)
{
  funclist[[i]] <- function(x) print(i)
}

funclist[[1]]('foo')

出力は次のとおりです。

[1] 5

は参照によってキャプチャされているようです。値でキャプチャしたい、つまり出力は

[1] 1

参照ではなく値でiをキャプチャするように R に指示する方法はありますか?

4

2 に答える 2

6

ループを実行するforと、ループが実行される環境に変数が作成され、ループで作成された関数もこの環境から実行されます。したがって、ループからのインデックス値を使用するこの方法で作成された関数を実行するときはいつでも、それらは最終値にのみアクセスでき、その変数が残っている限りのみアクセスできます (rm(i)リスト内の関数の 1 つを試してみてください)。 .

あなたがする必要があるのは、独自の環境でインデックス値を関数にバインドすることです。lapply自動的にこれを行います。ただし、遅延評価には落とし穴があります。あなたがしなければならないことは、無名関数を作成する前forceの評価でもあります:i

funclist <- lapply(1:5, function(i) {force(i); function(x) print(i)})
funclist[[1]]('foo')
[1] 1
funclist[[5]]('foo')
[1] 5
于 2013-04-25T14:21:49.427 に答える
3

あなたが望むものについての私の読みは、関数が定義されているときに関数の環境内に値を保存し、内部計算のためにその値を保持することです。

そのためには、クロージャーが必要です。

i <- 3
test <- local({
  i <- i
  function(x) x[i]
})
test(letters[1:5]) # returns 'c'
i <- 5
test(letters[1:5]) # still returns 'c' (i.e. i is local to the test closure)

それはあなたが望んでいたものですか?

于 2013-04-25T14:21:21.150 に答える