【发布时间】:2015-03-29 13:56:09
【问题描述】:
我正在使用 lapply 创建新函数,并注意到有时它会返回预期的内容,有时它只返回最后创建的函数的副本。
这里是一个说明的例子,考虑一下我想制作以下简单的函数列表
listFuncs = lapply( 1:3, function(X){
myfunc = function(y){X+y}
myfunc
})
不幸的是,一个简单的评估表明我没有得到我希望的结果
listFuncs[[1]](10)
[1] 13
listFuncs[[2]](10)
[1] 13
确实,列表只包含函数
myfunc = function(y){3+y}
但是,如果我在创建函数的过程中输出了一些东西,例如
listFuncs = lapply( 1:3, function(X){
myfunc = function(y){X+y}
print(myfunc(0)) ## NEW LINE HERE !!!
myfunc
})
那么我的函数列表是“如预期的那样”
[1] 1
[1] 2
[1] 3
> listFuncs[[1]](10)
[1] 11
> listFuncs[[2]](10)
[1] 12
有人明白发生了什么吗?提前,谢谢。
【问题讨论】:
-
这不是错误,而是一项功能。研究“惰性评估”的概念。
-
@Roland 我对从here 开始的关于 r-devel 的长时间讨论感到惊讶,这似乎包括认真考虑这是一个错误的立场(至少是 Radford)。这是我第一次看到“官方”人士提出这种想法。
-
似乎只有 Radford Neal 和 Jeroen Ooms 称其为错误,而且他们都不是官方的; Neal 显然对 R 了解很深,但他经常不同意 R-core。
-
@BenBolker 我认为 Luke 等人对改变行为(或至少讨论它)的开放态度是默认它至少是不可取的。