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
,