在以下最小工作示例中,使用a_promise
将a_call
变为substitute()
。我可以看到a_promise
对象存储表达式和应该评估该表达式的环境。
但是,据我所知,一旦它转变为a_call
,a_call
存储的唯一内容就是表达式(condition
)而没有引用环境哪个表达式可以评估并转换为a >= 4
。
但是,最后的错误表明eval(a_call, df, parent.frame()
确实在尝试查找对象a
,这意味着a_call
确实被翻译为a >= 4
。怎么样?
library(pryr)
f <- function(df, a_promise) {
print(promise_info(a_promise)) #> shows both the expression and the eval envir
a_call <- substitute(a_promise)
print(a_call) #> condition
eval(a_call, df, parent.frame())
}
g <- function(df, condition) {
f(df, condition)
}
df <- data.frame(a=1:5, b=5:1)
g(df, a >= 4)
#> Error in eval(expr, envir, enclos) : object 'a' not found
答案 0 :(得分:1)
当你这样做时
a_call <- substitute(a_promise)
您收到的传递给a_promise
的表达式为condition
。 a_call
的类是symbol
(不是调用或表达式)。这个symbol
实际上是指向父框架中尚未解决的另一个承诺的指针。因此,当您在f
时,您已经错过了以a >= 4
方式将substitute
转换为表达式的机会。现在,当你要求condition
的价值时,你正在评估先前的承诺并得到一个非感性的结果。这真的归结为
eval( a >= 4, df)
# Error in eval(a >= 4, df) : object 'a' not found
和
eval( expression(a >= 4), df)
# [1] FALSE FALSE FALSE TRUE TRUE.
当condition
解决了它的承诺时,它eval()
内没有这样做。