我不确定承诺在 R 中做了什么
如果一个人跑
a = lapply(seq_len(2), function(n) { function() {n}})
b = lapply(seq_len(2), function(n) {n})
我们可以看到
a[[1]]() # == 2
b[[1]] # == 1
我知道 R 使用promise 的对象并在其环境中懒惰地评估一个表达式,但我不明白为什么为每个函数创建的不同环境不包含它们自己的 n 值。
[[1]]
function ()
{
n
}
<environment: 0x7f9b2416ad18>
[[2]]
function ()
{
n
}
<environment: 0x7f9b2416ab20>
as.list(environment(a[[1]]))
$n
[1] 2
as.list(environment(a[[2]]))
$n
[1] 2
是否可以通过 lapply 函数以某种方式修复语义?
lapply
function (X, FUN, ...)
{
FUN <- match.fun(FUN)
if (!is.vector(X) || is.object(X))
X <- as.list(X)
.Internal(lapply(X, FUN))
}
<bytecode: 0x7f9b25150f18>
<environment: namespace:base>
PS:重新聚焦的问题
编辑:具体来说,是否可以编写一个lapply2函数,该函数通常“强制”参数具有统一的行为,如下所示:
pl <- lapply (1:3, function(y) { force(y); function(x) pow(x,y) } )
pl <- lapply2(1:3, function(y) { function(x) pow(x,y) } )