Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 是什么机制使得+;`当+定义时工作;在空旷的环境中?_R - Fatal编程技术网

R 是什么机制使得+;`当+定义时工作;在空旷的环境中?

R 是什么机制使得+;`当+定义时工作;在空旷的环境中?,r,R,在这里,我创建了一个未赋值表达式: e2 <- expression(x+10) 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 <- expression(x+10)
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)

env在此处定义环境时:

env <- as.environment(list(x=20,`+`=function(a,b) {a+b}))
这一观察结果值得思考一下:函数可以是环境
x
的成员,但属于
y
(其中“归属”表示其对象查找使用
y
,而不是
x

而且
.GlobalEnv
知道
+
,因为它是在其父代的某个地方定义的(可通过
search()
访问)

顺便说一句,如果您使用了
list2env
而不是
as.environment
,那么您的初始代码就可以工作了:

$ env = list2env(list(x = 20))
$ eval(e2, env)
30

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

惊人的快速回复!谢谢一个函数可以是一个环境的成员,但却可以在另一个环境中执行对象查找,这仍然令人震惊。有什么原因使它变得简单吗?@KunRen原因是函数的环境是执行其定义的地方——在您的例子中,这就是全局环境。如果要在
env
中创建函数,可以使用
中的
local
。我不知道这种行为的原因,但它确实有意义,而且它是实现包所必需的,请参阅。非常有用的文章!但是还有另一个问题:
+
.GlobalEnv
作为其父环境,我如何定义具有本地父环境的函数。比如:
env@KunRen正如我之前的评论所说,您可以使用
local
inthein
在环境中定义函数。但是,请确保为您的
env
提供一个合适的父环境–换句话说,不要使用
as.environment
,请使用
list2env
,如我的回答所示。这样,函数可以在本地定义(使用
local
中的
),并且仍然可以在全局环境中找到符号。您可能会觉得很有用。很高兴在这里见到您,@hadley!一个月前我在网上读了你那本很棒的新书。也许我错过了一些要点,当然还有更多的东西需要我去消化。无论如何谢谢你!关键区别在于“创建函数的环境”与“函数驻留的环境”
$ environment(env$`+`)
<environment: R_GlobalEnv>
$ env = list2env(list(x = 20))
$ eval(e2, env)
30