gpt4 book ai didi

r - 在空环境中由 + 定义时使 `+` 工作的机制是什么?

转载 作者:行者123 更新时间:2023-12-04 15:22:44 47 4
gpt4 key购买 nike

在这里,我创建了一个未计算的表达式:

e2 <- expression(x+10)

如果我提供一个环境,其中 x被定义为
env <- as.environment(list(x=20))
eval(e2,env)

R会报错:
Error in eval(expr, envir, enclos) : could not find function "+"

这是可以理解的,因为 env是一个从头开始创建的环境,也就是说,它没有 + 所在的父环境。被定义为。

但是,如果我提供 +在要转换为这样的环境的列表中
env <- as.environment(list(x=20,`+`=function(a,b) {a+b}))
eval(e2,env)

评估工作正常并产生 30。

但是,当我定义 + 时在列表中,它是一个二元函数,其主体也使用+,定义在 {base} .我知道函数返回在 R 中被懒惰地计算,但是为什么这可以工作?如 a+b当我调用 eval 时,函数体中的函数被懒惰地评估为 e2env ,即使 +在这个没有父环境的环境中定义,它仍然应该调用 +就其本身而言,这应该以无限循环告终。为什么不会发生这样的事?这里的机制是什么?

最佳答案

当您在此处定义环境时:

env <- as.environment(list(x=20,`+`=function(a,b) {a+b}))

那么函数定义实际上是在 .GlobalEnv中定义的(即定义执行的地方。可以验证一下:
$ environment(env$`+`)
<environment: R_GlobalEnv>

这个观察值得稍微思考一下:一个函数可以是环境的成员 x ,但属于 y (其中“属于”意味着它的对象查找使用 y 而不是 x )。

.GlobalEnv知乎 + ,因为它是在其父项中的某处定义的(可通过 search() 访问)。

顺便说一句,如果您使用过 list2env而不是 as.environment ,您的初始代码会起作用:
$ env = list2env(list(x = 20))
$ eval(e2, env)
30

原因是,不像 as.environment , list2env默认情况下使用当前环境作为新环境的父环境(这可以通过 parent 参数控制)。 as.environment相比之下,使用空环境(从列表创建环境时)。

关于r - 在空环境中由 + 定义时使 `+` 工作的机制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805816/

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