do.call форсирует оценку аргумента перед аккуратной оценкой Рланга - PullRequest
0 голосов
/ 08 февраля 2019

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

0 голосов
/ 08 февраля 2019

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

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

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

...