在承诺变成呼叫后,评估环境如何保留?

时间:2014-08-19 04:05:03

标签: r promise evaluation

在以下最小工作示例中,使用a_promisea_call变为substitute()。我可以看到a_promise对象存储表达式和应该评估该表达式的环境。

但是,据我所知,一旦它转变为a_calla_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 

1 个答案:

答案 0 :(得分:1)

当你这样做时

a_call <- substitute(a_promise)

您收到的传递给a_promise的表达式为conditiona_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()内没有这样做。