在eval_tidy中访问错误变量的函数

时间:2019-01-07 22:23:47

标签: r rlang tidyeval

所以我一生无法理解这里发生的事情。本来应该是对可能的极端情况的小探索,但它最终揭示出我对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()

1 个答案:

答案 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带来奇怪的感觉。