3

次のスニペットがそのように動作する理由を誰か説明してもらえますか?

l <- list()
AddFn <- function(str) { l[[length(l) + 1]] <<- function() { return(str) }}
AddFn("hello")
AddFn("there")
l[[1]]()  # Returns "hello" as expected
l[[2]]()  # Returns "there" as expected
for (letter in letters) AddFn(letter)
l[[3]]()  # Returns "z"

l[[3]]()「a」を返すと思っていました。私は何が欠けていますか?私の AddFn 関数は正確に何をしますか?

前もって感謝します、

エイドリアン

4

2 に答える 2

7

遅延評価では、ループ内の最後の評価が返されることがよくあります。代わりにこれを試してください:

AddFn <- function(str) { force(str); l[[length(l) + 1]] <<- function() { return(str) }}
于 2012-05-13T21:19:30.183 に答える
7

これは厄介なものです。str引数は return という promise に設定されていますがletter、実際には 経由で呼び出されるまで評価されませんl[[3]]()その時点での値が使用されます。

最後の部分を次のように変更した場合:

for (letter in letters) AddFn(letter)
letter="foo" 
l[[3]]()  # Returns "foo"

…もっとはっきり見えます。...だから、@DWin が提案することを実行し、force最初に呼び出します。

于 2012-05-13T21:24:52.943 に答える