首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >do.call强制在rlang的整洁计算之前进行参数计算

do.call强制在rlang的整洁计算之前进行参数计算
EN

Stack Overflow用户
提问于 2019-02-08 21:48:39
回答 1查看 122关注 0票数 2

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

由于rlang::exec()依赖于do.call,因此它给出了相同的结果。rlang::eval_tidy(call2(..))方法似乎是一种解决方案,也是基于它的rlang::invoke()

问题是:

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

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

为什么invokeexec更适合rlang的哲学,但却被软弃用?

代码语言:javascript
复制
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创建于2019-02-08 (v0.2.0)。

EN

回答 1

Stack Overflow用户

发布于 2019-02-08 22:02:53

引用以下论点:

代码语言:javascript
复制
do.call(quoting_fun, list(quote(obj)))
#<quosure>
#expr: ^obj
#env:  global

评估是在list中进行的,而不是在do.call中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54593806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档