【问题标题】:how to specify a package or namespace for `rlang::exec`?如何为 `rlang::exec` 指定包或命名空间?
【发布时间】:2021-09-23 12:38:24
【问题描述】:

我正在尝试编写一个函数(在包内),该函数涉及允许用户从特定包中指定要执行的函数并为该函数提供额外的参数。

我可以使用rlang::call2 分两步完成此操作,如下所示:

# `my_pkg` = "foo" (user-input)
# `my_fun` = "bar" (user-input)
# `args` is a named list (user-input)

the_call <- rlang::call2(.fn = my_fun , !!!args , .ns = my_pkg)
base::eval(the_call)

我觉得“正确”的做法是只使用rlang::exec,但rlang::exec 没有.nsrlang::call2 那样的参数。相反,它有一个 .env 参数。

如何将函数的包(或命名空间)指定给 rlang::exec rlang::exec.env 参数似乎不是答案,因为用户应该能够在特定包(已安装)中指定功能,而无需先加载该包。

或者rlang::exec 不是为了这个目的?

【问题讨论】:

  • 请问您的两步法有什么问题?
  • 什么都没有。但是,rlang::exec 的意义何在?

标签: r rlang


【解决方案1】:

试试

real_fun <- get(my_fun, envir=as.environment(paste0("package:", my_pkg)))
rlang::exec(real_fun, !!!args)

由于"packagename::functionname"(字符串)不能传递给rlang::exec,我们可以传递真正的函数。这可以通过使用get 并传递特定环境(来自包命名空间,如上)来检索。

(这并不能减少两个表达式来影响exec,但它确实允许一个直接使用exec。)

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2021-05-29
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多