квазиквотация тидыра с лексической областью видимости

Я понимаю, что аккуратная оценка не использует лексическую область видимости, но я хочу, чтобы квазиквотация в rlang искала символы в среде, которую я выберу.

Текущее поведение:

envir <- new.env(parent = globalenv())
eval(parse(text = "little_b <- 'b'"), envir = envir)
eval(rlang::expr(!!little_b), envir = envir)

## Error in (function (x)  : object 'little_b' not found

Вместо этого я хочу, чтобы последняя строка возвращала "b". Бонусные баллы, если вы найдете версию eval(), которая выполняет здесь свою работу И работает как evaluate::try_capture_stack().

К вашему сведению: я пытаюсь решить эту проблему.


person landau    schedule 30.01.2018    source источник
comment
tidyeval - это лексическая область видимости;)   -  person Lionel Henry    schedule 30.01.2018


Ответы (1)


Мы можем использовать with для передачи выражения в среде

with(envir, expr(!!little_b))
#[1] "b"

Или другой вариант - local

local(rlang::expr(!!little_b), envir = envir)
#[1] "b"

Или пройдите через quote в eval (как упомянул @lionel)

eval(quote(expr = rlang::expr(!! little_b)), envir = envir)
#[1] "b"
person akrun    schedule 30.01.2018
comment
Последний пример должен быть quote() вместо substitute(), поскольку вы не выполняете никакой подстановки. - person Lionel Henry; 30.01.2018