首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rlang::exec with package-函数规范

rlang::exec with package-函数规范
EN

Stack Overflow用户
提问于 2021-07-09 23:24:25
回答 1查看 53关注 0票数 1

当我为函数调用指定包时,让rlang::exec()正常工作时遇到了问题。

简单的例子:

代码语言:javascript
复制
rlang::exec("tibble" , a=1:5) # this fails because package 'tibble' is not yet loaded.
# Error in tibble(a = 1:5) : could not find function "tibble"

library(tibble)
rlang::exec("tibble" , a=1:5) # now it works.

rlang::exec("tibble::tibble" , a=1:5) # this fails.
# Error in `tibble::tibble`(a = 1:5) :
#  could not find function "tibble::tibble"

最终,我希望将这样的命令包含在我正在制作的R包中。应该是这样的:

代码语言:javascript
复制
foo <- function(stuff , fun , args) {
    # do stuff, and then:

    rlang::exec(fun , !!!args)

    # do more stuff.
}

我希望用户能够传递特定包中的函数。如下所示:

代码语言:javascript
复制
foo(stuff = whatever , fun = "pkg::fun" , args = list(a=1,b=2) )

用户不需要先加载包pkg就可以做到这一点,对吧?

EN

回答 1

Stack Overflow用户

发布于 2021-07-09 23:55:01

您可以在使用base::eval计算表达式之前使用rlang::call2构造表达式,而不是使用同时构造表达式和计算表达式的rlang::exec来解决此问题。call2有一个参数.ns,它允许您定义要在其中查找函数的名称空间,即:

代码语言:javascript
复制
base::eval(rlang::call2("tibble", a = 1:5, .ns = "tibble"))

或者在您的上一个示例中

代码语言:javascript
复制
base::eval(rlang::call2("foo", !!!args, .ns = "pkg"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68319202

复制
相关文章

相似问题

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