R使用lappy生成函数:bug还是什么?
我正在使用lappy创建新函数,并注意到有时它返回预期的结果,有时它只返回最后创建的函数的副本R使用lappy生成函数:bug还是什么?,r,lapply,R,Lapply,我正在使用lappy创建新函数,并注意到有时它返回预期的结果,有时它只返回最后创建的函数的副本 这里是一个例子,考虑我想做以下简单的函数清单< /P> listFuncs = lapply( 1:3, function(X){ myfunc = function(y){X+y} myfunc }) 不幸的是,一个简单的评估表明我没有得到我所希望的 listFuncs[[1]](10) [1] 13 listFuncs[[2]](10) [1] 13 实际上,列表只包含函数 myfu
这里是一个例子,考虑我想做以下简单的函数清单< /P>
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
})
那么我的函数列表就是“如预期的那样”
有人知道发生了什么吗?请提前通知,谢谢。您可以使用以下功能:
listFuncs = lapply( 1:3,
function(X) {
force(X)
myfunc <- function(y) { X+y }
myfunc
}
)
listFuncs[[1]](10) ## 11
listFuncs=lapply(1:3,
函数(X){
力(X)
myfunc不是一个bug,它是一个特性。研究一下“懒惰评估”的概念。@Roland我对关于r-devel开始的长时间讨论感到惊讶,这似乎包括了对这是一个bug这一立场的认真考虑(至少是Radford)。这是我第一次看到“官方”大家都接受这个想法。看起来只有雷德福德·尼尔和杰伦·奥姆斯称之为bug,而且他们两人都不是官方的;尼尔显然非常理解R,但他经常不同意R-core。@BenBolker我接受了卢克等人的开放式意见,改变了行为(或至少讨论了它)默许至少是不可取的。
listFuncs = lapply( 1:3,
function(X) {
force(X)
myfunc <- function(y) { X+y }
myfunc
}
)
listFuncs[[1]](10) ## 11