所以我一生无法理解这里发生的事情。本来应该是对可能的极端情况的小探索,但它最终揭示出我对R /整洁的评估了解得很少。
我想了解为什么,当对一个函数进行编码以访问未在其参数中定义的变量时,eval_tidy
似乎无法掩盖其使用的变量。
请考虑以下内容,其中f
访问名为sup
的变量,该变量不会作为参数传递
library(rlang) # I'm using rlang 0.3.0
# Define `sup` globally
sup <- "yes"
f <- function() {
# Access whatever the `sup` variable is
if (sup == "yes") "YES"
else "NO"
}
f()
# 'YES'
q <- quote(f())
eval_tidy(q, c(sup="no"))
# 'YES'
我已经尝试了几乎所有内容,但是似乎无法从sup
中屏蔽f()
。
答案 0 :(得分:2)
数据屏蔽对表达式起作用,在您的示例中为quote(f())
。但是,掩蔽是词汇的,不是动态的。这意味着从表达式调用的函数将无法看到被屏蔽的绑定。
有一种方法可以实现您想要的。您可以在从函数的原始环境继承的环境中添加掩蔽绑定,并将后者替换为前者。 rlang使这变得很容易:
library("rlang")
sup <- "yes"
f <- function() if (sup == "yes") "YES" else "NO"
mask <- env(get_env(f), sup = "no")
f <- set_env(f, mask)
f()
#> [1] "NO"
但是,这似乎是一个很奇怪的设计选择,可能会给您的UI / DSL带来奇怪的感觉。