do.call форсирует оценку аргумента перед аккуратной оценкой Рланга

Я пытаюсь использовать фразы для хранения ссылок на объекты, над которыми я работаю. 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).

1 ответ

Цитировать аргумент:

do.call(quoting_fun, list(quote(obj)))
#<quosure>
#expr: ^obj
#env:  global

Оценка происходит в list и не в do.call,

Другие вопросы по тегам