当尝试使用创建类似函数的列表时lapply
,我发现列表中的所有函数都是相同的,并且等于最终元素应该是什么。
考虑以下:
pow <- function(x,y) x^y
pl <- lapply(1:3,function(y) function(x) pow(x,y))
pl
[[1]]
function (x)
pow(x, y)
<environment: 0x09ccd5f8>
[[2]]
function (x)
pow(x, y)
<environment: 0x09ccd6bc>
[[3]]
function (x)
pow(x, y)
<environment: 0x09ccd780>
当您尝试评估这些函数时,您会得到相同的结果:
pl[[1]](2)
[1] 8
pl[[2]](2)
[1] 8
pl[[3]](2)
[1] 8
这里发生了什么,我怎样才能得到我想要的结果(列表中的正确函数)?
R 通过promises http://cran.r-project.org/doc/manuals/r-release/R-lang.html#Promise-objects,而不是价值观本身。承诺是在第一次评估时强制执行的,而不是在通过时执行,到那时,如果使用问题中的代码,索引就会发生变化。代码可以写成如下force http://stat.ethz.ch/R-manual/R-patched/library/base/html/force.html调用外部匿名函数时的承诺并向读者明确表示:
pl <- lapply(1:3, function(y) { force(y); function(x) pow(x,y) } )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)