r - 通过包+函数名引用 R 包中的函数
问题描述
我正在开发一种自动化工具,该工具在已知文件夹(例如/src
)中接收正在开发的 R 包,并希望在更广泛的上下文中从包中运行某些功能:例如 running function do_a_thing()
。
一个问题是,尽管可以可靠地加载包,例如使用devtools::load_all("src")
,但我不知道作者可能在文件Package
字段中输入的包名DESCRIPTION
。
这意味着我不能只调用src::do_a_thing()
,因为实际形式可能是 eg MyWeirdPackageName::do_a_thing()
。
我知道这个desc
包支持查找这个包名:
library(desc)
desc <- description$new("src")
desc$get("Package")
# > Package: 'MyWeirdPackageName'
...并且还exists
可以检查包中是否存在目标函数:
exists("do_a_thing", where=paste("package", desc$get("Package"), sep=":"), mode="function")
# > TRUE
...但是鉴于我知道(在运行时,作为字符向量)它的完全限定名称是,我怎么能真正调用MyWeirdPackageName::do_a_thing
这个函数呢?
Vanillaget
似乎无法通过接受where
参数或将完全限定名称作为输入来处理命名空间方面:
testfn <- get(paste(desc$get("Package"), "::do_a_thing", sep=''), mode="function")
# > Error in get(paste(desc$get("Package"), "::do_a_thing", sep = ""), mode = "function"): object
# 'MyWeirdPackageName::do_a_thing' of mode 'function' was not found
鉴于我知道它存在以及它所在的包的名称,我如何从这个do_a_thing
包中显式调用该函数?
解决方案
我认为你可以使用eval(parse(text="code here"))
技巧。例如,
mean(c(1,2,3,4))
#[1] 2.5
# is equivalent to
eval(parse(text="mean(c(1,2,3,4))"))
#[1] 2.5
所以在你的情况下,这会起作用。
eval(parse(text="MyWeirdPackageName::do_a_thing"))
如果您可以将包名称作为字符串获取(我认为您已经对此很熟悉了),那么您可以将其替换为:
packagename <- "???"
eval(parse(text=paste0(packagename, "::do_a_thing")))
推荐阅读
- python - SQLAlchemy 无法使用绝对路径连接到本地数据库
- visual-studio - 有没有办法在 Visual Studio 中打开两个包管理器控制台?
- ruby-on-rails - Rails 5:带迭代的数据库设计
- html - 详细信息标签文本不响应 CSS 边距
- amp-html - Google amp 页面无法正确加载
- python - Python 类似字典的数据结构,其中集合的任何元素都是该集合的键
- c++ - 使用 sprintf(snprintf) 重叠内存
- vue.js - vuejs 在 reactjs 之类的组件中显示 html
- mediawiki - 从维基百科获取类别:重要文章
- c# - XML 转换为 Json 和 DeserializeObject 问题 - InfoPath 命名空间?