使用R创建函数列表?

Sta*_*Bug 3 r

我有下面的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)

jor*_*ran 6

这可能(并且可能是某处)对R中的懒惰评估如何工作的练习.您需要x在创建每个函数之前强制进行评估:

creatFun <- function(x, y)
{
    force(x)
  retFun <-  function(z)
  {
    z + x + y
  }
}
Run Code Online (Sandbox Code Playgroud)

...并且为了安全起见,您可能也应该force(y)在没有为该参数传递单个值的时候.

在Hadley即将出版的书中可以找到一个很好的讨论,特别是关于函数章节中的延迟评估的部分(向下滚动).