?do.call
says:
envir
评估调用的环境。这会是
如果什么是字符串并且参数是最有用的
符号或引用的表达式。
我们可以很容易地说明这一点,如果what=
的论证do.call
是一个字符串。然后envir=
确定在哪里查找它。
e <- new.env()
e$f <- function() 2
f <- function() 3
do.call("f", list())
## [1] 3
do.call("f", list(), envir = e)
## [1] 2
正如问题中的代码所示,参数也是如此。请注意,参数已被引用,因为match.call()
正在使用中。
在这种情况下发生了什么h1
and g1
这是有效运行的g1
do.call(print, list(call("*", quote(x), quote(y))), quote = FALSE)
现在发现x
in g1
(since g1
有一个论点x
)但是没有y
in g1
所以它看起来的父环境g1
这是它发现的全球环境y
.
如果是h2
and g2
它运行在g2
:
do.call(print, list(call("*", quote(x), quote(y))), quote = FALSE, envir = parent.frame())
它发现x
and y
in h2
这是的父框架g2
.
请注意,父环境与父框架不同:
- 父环境由函数所在的位置决定defined因此,如果函数是在全局环境中定义的,那么它的父环境就是全局环境。
- 父框架是调用者的环境