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}进行了测试.
我认为自提出问题以来文档可能已经更新,但对于新访问者来说,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)