функции, обращающиеся к неверным переменным в eval_tidy - PullRequest
0 голосов
/ 08 января 2019

Так что я не могу на всю жизнь понять, что здесь происходит. Предполагалось, что это будет небольшое исследование возможного крайнего случая, но в итоге выяснилось, насколько мало я понимаю оценку R / tidy.

Я хочу понять, почему, когда функция закодирована для доступа к переменной, которую она не определяет в своих аргументах, 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 голосов
/ 08 января 2019

Маскирование данных работает с выражениями, 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.

...