在哈德利的高级R书籍 http://adv-r.had.co.nz/Computing-on-the-language.html,有一段代码我无法理解输出。
f <- function(x) substitute(x)
g <- function(x) deparse(f(x))
g(1:10)
g(x)
g(x + y ^ 2 / z + exp(a * sin(b)))
为什么他们都回来了"x"
?尤其是当
g <- function(x) deparse(substitute(x))
返回"1:10"
, "x"
, and "x + y ^ 2 / z + exp(a * sin(b))"
正如预期的那样。
首先,一些背景信息:承诺是一个未经评估的论点。 Promise 包含两部分:1)引起延迟计算的代码/表达式(可以通过以下方式查看此代码)substitute
or pryr::promise_info
),以及 2)创建此代码/表达式并应在其中进行评估的环境(此环境可以通过以下方式查看)pryr::promise_info
).
如果您更改了,问题也会更清楚g()
功能为
g <- function(x) deparse(f(whatever))
你总是会得到“任何东西”。这是因为当g()
calls f(whatever)
,它将一个 Promise 对象传递给f()
--这个对象有代码whatever
和环境g()
的执行环境。然后,substitute
within f()
查看这个 Promise 对象并返回该 Promise 的代码/表达式,即whatever
在这种情况下。
可以通过运行以下代码来确认 Promise 对象的代码和环境:
library(pryr) # need to install it
f <- function(x) {
print(promise_info(x))
substitute(x)
}
g <- function(x) {
print(environment())
f(whatever)
}
g(1:10)
最重要的是,无论你传递给什么,你都会返回f(whatever)
。这就是为什么分离这些功能不是一个好主意。一种解决方法是使用
g <- function(...) deparse(f(...))
这样参数就被传递到f()
并且没有更名g()
.
另一方面,g <- function(x) deparse(substitute(x)); g(1:10)
产生1:10
因为,在这种情况下,substitute
正在查看 Promise 对象x
(与 Promise 对象相反whatever
在上述情况下)。承诺x
这里有代码1:10
和环境R_GlobalEnv
。 (同样,这可以使用g <- function(x) { print(promise_info(x) ; deparse(substitute(x))
. So substitute(x)
回报1:10
正如预期的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)