Я пытаюсь использовать выражения для хранения ссылок на объекты, над которыми я работаю.do.call
нарушает идею, рано оценивая аргументы, поэтому результирующий quosure
сохраняет новую копию объекта, оцененного в empty_env()
, вместо фактического вызова объекта.
rlang::exec()
дает те же результаты, поскольку он опирается на do.call
.Подход rlang::eval_tidy(call2(..))
, кажется, является решением, а также основан на нем rlang::invoke()
.
Вопросы:
Каков желаемый способ в R сохранить ссылку на объект /вызов объекта вместо его явного сохранения в списке.
Можно ли смешивать do.call
и rlang
, поскольку это приводит к ненужным вычислениям и копированию?
Почему invoke
является мягким устаревшим, и в то же время лучше соответствует философии рланга, чем exec
?
require(rlang)
#> Loading required package: rlang
quoting_fun <- function(x) {
x_enq <- enquo(x) # enquote
x + length(x) # do something
x_enq
}
obj <- 1:10L
quoting_fun(obj) # ok
#> <quosure>
#> expr: ^obj
#> env: global
do.call(quoting_fun, list(obj)) # not ok
#> <quosure>
#> expr: ^<int: 1L, 2L, 3L, 4L, 5L, ...>
#> env: empty
exec(quoting_fun, obj)
#> <quosure>
#> expr: ^<int: 1L, 2L, 3L, 4L, 5L, ...>
#> env: empty
rlang::invoke(quoting_fun, list(obj))
#> <quosure>
#> expr: ^1
#> env: 000000001C8DDFD8
eval_tidy(call2(quoting_fun, quo(obj)))
#> <quosure>
#> expr: ^obj
#> env: global
Создано в 2019-02-08 пакетом представлением (v0.2.0).