gpt4 book ai didi

r - lapply/R中的 promise

转载 作者:行者123 更新时间:2023-12-03 16:55:28 25 4
gpt4 key购买 nike

我不确定 promise 在 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's object并懒惰地评估其环境中的表达式,但我不明白为什么不同的 环境 为每个函数创建的不会包含它们自己的 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) } )

最佳答案

我发现这种形式更容易理解:

f=function(n) {function() {n}}
x=1
a=f(x)
x=2
a()
[1] 2

文档的关键部分是

When a function is called the arguments are matched and then each of the formal arguments is bound to a promise. The expression that was given for that formal argument and a pointer to the environment the function was called from are stored in the promise.



来电后 a=f(x) , 函数参数 n绑定(bind)到名称为 x 的 promise 和一个指向全局环境的指针 .GlobalEnv .

在您的 lapply例如,匿名函数 function(n) { function() {n}}每次都从全局环境中调用。这就是为什么列表中的每个元素 a得到与 n 相同的值: 它来自全局环境。我看不出如何通过重写 lapply 来改变这种行为。

关于r - lapply/R中的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com