构建返回字符串的函数列表

Adr*_*ian 3 r

有人可以解释为什么以下代码片段的行为与它一样吗?

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"
Run Code Online (Sandbox Code Playgroud)

我期望l[[3]]()回归"a".我错过了什么?我的AddFn函数究竟做了什么?

先感谢您,

阿德里安

42-*_*42- 7

延迟评估通常会导致返回循环中的最后一次评估.试试这个:

AddFn <- function(str) { force(str); l[[length(l) + 1]] <<- function() { return(str) }}
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 7

这是一个讨厌的.该str参数设置为一个表示要返回的promise letter,但在调用via之前它实际上不会被计算l[[3]]().所以使用那个时候的价值!

如果您将最后一部分更改为:

for (letter in letters) AddFn(letter)
letter="foo" 
l[[3]]()  # Returns "foo"
Run Code Online (Sandbox Code Playgroud)

......你会更清楚地看到它....所以做@DWin建议并force先打电话.