【问题标题】:do.call forces argument evaluation before rlang's tidy evaluationdo.call 在 rlang 的 tidy 评估之前强制参数评估
【发布时间】:2019-07-02 18:40:18
【问题描述】:

我正在尝试使用 quosures 来存储对我正在操作的对象的引用。 do.call 打破了这个想法,提前评估了参数,因此生成的 quosure 存储了在 empty_env() 中评估的对象的新副本,而不是对对象的实际调用。

rlang::exec() 给出相同的结果,因为它依赖于do.callrlang::eval_tidy(call2(..)) 方法似乎是一种解决方案,以及基于它的rlang::invoke()

问题是:

在 R 中存储对对象/对象调用的引用的理想方式是什么,而不是将其显式存储在列表中。

可以混合使用do.callrlang,因为它会导致不必要的计算和复制?

为什么invokeexec 更符合rlang 的理念,但被软弃用?

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

reprex package (v0.2.0) 于 2019 年 2 月 8 日创建。

【问题讨论】:

  • 多部分问题被认为过于宽泛。一次专注于一个问题。这样您就可以显示您进行了哪些搜索以及为什么之前的答案不够充分。

标签: r tidyverse rlang do.call tidyeval


【解决方案1】:

引用论点:

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

评估发生在list 而不是do.call

【讨论】:

  • 不,因为quosure,而不是int,将被传递给quoting_fun()。我已经引用了一个传递给 call2() 的参数,但这有效,因为它已经使用 list2() 来引用参数。
猜你喜欢
  • 2018-06-10
  • 2016-06-28
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多