base::substitute
的文档描述如下:
通过检查解析的每个组成部分来进行替换 树如下:如果它不是'env'中的绑定符号,那么它是 不变。 如果它是一个 Promise 对象,... Promise 的表达式槽会替换该符号。 如果它是普通变量,则替换其 VALUE,除非“env”是 .GlobalEnv,在这种情况下符号保持不变。
在最后一句中,“值”是不明确的:我们需要将对象的解析表示放入返回的
language
对象中。但这个表示是如何选择的呢?
我的假设是使用
base::deparse
,但它并不总是这样工作:
e <- new.env()
e$df <- tibble::tibble(1:5)
e$env <- new.env()
e$x <- 1
substitute(x+1, e) # 1 + 1
substitute(df+1, e) # list(`1:5` = 1:5) + 1 (does not match deparse(e$df))
substitute(env+1, e) # <environment> + 1 (does match deparse(e$env))
# if expr to substitute is a name, return the object itself
# (no need to return a language object, no need for deparsing)
identical(substitute(df, e), e$df)
identical(substitute(env, e), e$env)
我没有看到任何歧义。 “值”是指与符号绑定的值。
e1 <- new.env()
e1$a <- 1
a <- 2
通过检查解析树的每个组件来进行替换 如下:如果不是env中的绑定符号,则不变。
substitute(b, env = e1)
#b
如果它是一个 Promise 对象,即函数或函数的形式参数 使用delayedAssign()显式创建,表达式槽 Promise 取代了符号。
foo <- function(x) substitute(x)
foo(b)
#b
delayedAssign("c", hello, assign.env = e1)
substitute(c, env = e1)
#hello
如果是普通变量,则替换其值,
substitute(a, env = e1)
#1
除非 env 是 .GlobalEnv,在这种情况下符号保持不变。
substitute(a, env = .GlobalEnv)
#a