首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在lapply /R中的承诺

在lapply /R中的承诺
EN

Stack Overflow用户
提问于 2013-07-08 15:42:32
回答 2查看 360关注 0票数 5

我不知道这些承诺在R中做了什么

如果有人跑了

代码语言:javascript
复制
a = lapply(seq_len(2), function(n) { function() {n}})
b = lapply(seq_len(2), function(n)  {n})

我们可以看到

代码语言:javascript
复制
a[[1]]() # == 2
b[[1]]   # == 1

我理解R使用承诺的对象并在其环境中懒洋洋地计算表达式,但我不明白为什么为每个函数创建的不同环境不包含它们自己的n值。

代码语言:javascript
复制
[[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函数来修复语义?

代码语言:javascript
复制
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函数,如:

代码语言:javascript
复制
pl <- lapply (1:3, function(y) { force(y); function(x) pow(x,y) } )
pl <- lapply2(1:3, function(y) { function(x) pow(x,y) } )
EN

回答 2

Stack Overflow用户

发布于 2013-08-01 13:39:17

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

代码语言:javascript
复制
f=function(n) {function() {n}}
x=1
a=f(x)
x=2
a()
[1] 2

文档的关键部分是

当一个函数被调用时,参数被匹配,然后每个形式的参数被绑定到一个承诺。为该形式参数提供的表达式和调用函数的环境指针都存储在“承诺”中。

在调用a=f(x)之后,函数参数n绑定到名称为x的承诺和指向全局环境.GlobalEnv的指针。

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

票数 2
EN

Stack Overflow用户

发布于 2017-01-24 10:45:39

不久前,我发表了一条评论,认为R的最新版本可能会出现这种情况,但这里也有一个官方证据表明,lapply现在的行为与取自3.2.0lapply2版本完全相同。

  • 高级函数(如apply函数和Reduce() )现在将参数强制应用到它们所应用的函数中,以消除闭包中惰性计算和变量捕获之间的不希望的交互。这解决了PR#16093问题。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17530725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档