Hadley高级R书中的非标准评估

2024-02-22

在哈德利的高级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(使用前将#替换为@)

Hadley高级R书中的非标准评估 的相关文章

随机推荐