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