数据掩码中未找到变量

10
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

我原本期望在 e 中找到 Temp。我做错了什么?

附注:我使用的是 R 版本 3.5.0,并测试了 {rlang} 的最新 CRAN 和 GitHub 版本。


1
这很有趣,因为get("Temp", as_data_mask(list(), parent = e))get("Temp", as_data_mask(list(Temp=1), parent = e))都能按预期工作。不过把这个问题发布到rlang的问题页面可能更合适:https://github.com/r-lib/rlang/issues - MrFlick
我刚开始使用 {rlang},所以我不知道问题是出在我身上还是 {rlang}。 - F. Privé
1
@Tung 有趣吗?这基本上就像 new.env(parent=globalenv()),对吧?你期望它返回不同的东西。需要一个新对象来保存父级信息。 - MrFlick
1
@Tung 我认为这是正常的,因为e是父级,而不是环境本身。请参见env_parents(as_data_mask(list(), parent = e)) - F. Privé
1
我在 {rlang} 的代码库上开了一个 问题 - F. Privé
显示剩余2条评论
1个回答

1
我认为自从问题被提出以来,文档可能已经更新了,但对于新的访问者,与as_data_mask有关的rlang文档的相关部分是: parent 已弃用。此参数不再起作用。数据掩码的父级是通过以下方式确定的: eval_tidy() 的 env 参数 适用时的 Quosure 环境
因此,在 eval_tidy(myquo, data = as_data_mask(list(), parent = e)) 的情况下,eval_tidy 的 env 和 myquo 上的 quosure env 都是全局 env,并且数据掩码本身为空,因此找不到 Temp。
eval_tidy(myquo, data = as_data_mask(datasets::airquality)) 

这段代码可以工作,但其中存在不必要的调用。因为eval_tidy的data参数会将数据框转换为数据掩码,所以最简单的方法是:

eval_tidy(myquo, data = datasets::airquality) 

另一方面,如果您真的想在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接