当我为函数调用指定包时,让rlang::exec()正常工作时遇到了问题。
简单的例子:
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包中。应该是这样的:
foo <- function(stuff , fun , args) {
# do stuff, and then:
rlang::exec(fun , !!!args)
# do more stuff.
}我希望用户能够传递特定包中的函数。如下所示:
foo(stuff = whatever , fun = "pkg::fun" , args = list(a=1,b=2) )用户不需要先加载包pkg就可以做到这一点,对吧?
发布于 2021-07-09 23:55:01
您可以在使用base::eval计算表达式之前使用rlang::call2构造表达式,而不是使用同时构造表达式和计算表达式的rlang::exec来解决此问题。call2有一个参数.ns,它允许您定义要在其中查找函数的名称空间,即:
base::eval(rlang::call2("tibble", a = 1:5, .ns = "tibble"))或者在您的上一个示例中
base::eval(rlang::call2("foo", !!!args, .ns = "pkg"))https://stackoverflow.com/questions/68319202
复制相似问题