我有下面的R代码(这个问题的最后一部分),在最后一行之后,我希望得到一个4"retFun"函数的列表,每个函数用不同的x初始化,以便得到以下结果
funList[[1]](1) == 7 #TRUE
funList[[2]](1) == 8 #TRUE
Run Code Online (Sandbox Code Playgroud)
等等,但我似乎得到的是
funList[[1]](1) == 10 #TRUE
funList[[2]](1) == 10 #TRUE
Run Code Online (Sandbox Code Playgroud)
好像列表中的每个函数都具有相同的x值
creatFun <- function(x, y)
{
retFun <- function(z)
{
z + x + y
}
}
myL <- c(1,2,3,4)
funList <-sapply(myL, creatFun, y = 5)
Run Code Online (Sandbox Code Playgroud)
这可能(并且可能是某处)对R中的懒惰评估如何工作的练习.您需要x在创建每个函数之前强制进行评估:
creatFun <- function(x, y)
{
force(x)
retFun <- function(z)
{
z + x + y
}
}
Run Code Online (Sandbox Code Playgroud)
...并且为了安全起见,您可能也应该force(y)在没有为该参数传递单个值的时候.
在Hadley即将出版的书中可以找到一个很好的讨论,特别是关于函数章节中的延迟评估的部分(向下滚动).