使用数据掩码找不到变量

F. *_*ivé 10 r tidyeval

library(rlang)
myquo <- quo((Temp - 32) / 1.8)
eval_tidy(myquo, data = as_data_mask(datasets::airquality)) # works
e <- as_env(datasets::airquality, parent = global_env())
eval_tidy(myquo, data = as_data_mask(list(), parent = e))   # error
Run Code Online (Sandbox Code Playgroud)

我期望Temp被发现e.我究竟做错了什么?

PS:我有R版本3.5.0并使用最新的CRAN和GitHub版本的{rlang}进行了测试.

Tom*_*ood 1

我认为自提出问题以来文档可能已经更新,但对于新访问者来说,as_data_mask 的 rlang 文档的相关部分是:

父级 Soft 已弃用。这个说法已经没有任何作用了。数据掩码的父级由以下任一确定:

  • eval_tidy() 的 env 参数
  • 适用时限定环境

eval_tidy(myquo, data = as_data_mask(list(), parent = e))所以在eval_tidy的情况env下和quosure envmyquo都是全局env,而数据掩码本身是空的,因此Temp找不到原因。

eval_tidy(myquo, data = as_data_mask(datasets::airquality)) 
Run Code Online (Sandbox Code Playgroud)

有效,但其中有不必要的调用,因为 eval_tidy 的数据参数无论如何都会将 data.frame 转换为数据掩码,所以最简单的方法是。

eval_tidy(myquo, data = datasets::airquality) 
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您确实想在 中显式指定环境eval_tidy,您可以使用expr而不是quo

myexpr <- expr((Temp - 32) / 1.8)
eval_tidy(myexpr, data = as_data_mask(list(), parent = e)) # still fails since parent is overridden 
eval_tidy(myexpr, data = list(), env = e) # works since there's no quosure env to override env
Run Code Online (Sandbox Code Playgroud)