`substitute`如何选择对象的解析表示?

问题描述 投票:0回答:1

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) 
r parsing substitution
1个回答
0
投票

我没有看到任何歧义。 “值”是指与符号绑定的值。

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
© www.soinside.com 2019 - 2024. All rights reserved.