我正在将生产中的util函数转换为一个环境来封装(和分组)辅助函数:
帮助文件:
# File: Helper.R
hello <- function() {
print("Hello world")
}
客户端:
helper <- new.env()
source("Helper.R", local=helper)
helper$hello() # call the helper function
如何在不破坏源函数调用的情况下将我的源“Helper.R”迁移到库中?
我想要的是像
helper <- new.env()
library(Helper, local=helper)
helper$hello() # call the helper function (loaded from the library now)
有办法做到这一点吗?
答案 0 :(得分:1)
您可以使用‹modules› package中的import_package
功能(不是 CRAN上的功能,它不同!)。
然后以下方法在本地附加一个包:
modules::import_packge('pkg', attach = TRUE)
或者,可能更接近您实际想要做的事情,您可以按如下方式使用它:
pgk = modules::import_package('pkg')
现在根本没有附加包,可以通过pkg$obj
访问其导出的对象。这有点类似于基础R的loadNamespace
函数,但在幕后做得更多。
最后,考虑不要将您的帮助程序代码放入包中,而是将其作为模块分发。这毕竟是helper.r
代码文件(或文件夹),然后按如下方式使用它:
helper = modules::import('helper')
有关详细说明,请参阅自述文件包README和插图。
答案 1 :(得分:1)
添加到建议列表中,您还可以考虑在CRAN上使用modules包(请注意,我是作者)。当您的Helper.R
文件包含:
hello <- function() {
print("Hello world")
}
你可以使用
helper <- modules::use("Helper.R")
helper$hello()
将您的帮助程序函数封装在自己的环境中。该包还提供了一些函数来操作模块的本地命名空间(导入/导出)。
答案 2 :(得分:0)
另一种方式可能是:
# getNamespace returns the environment representing the name space name. The namespace is loaded if necessary.
# Internal function to support reflection on namespace objects!
env <- getNamespace("data.table")
cars <- env$as.data.table(mtcars)
此示例通过环境变量data.table
使包env
的所有对象可用。
注意:它使用内部R函数(不知道变化的风险真的很大)。
答案 3 :(得分:0)
我找到了另一个名为import
的包(类似于“模块”),允许将包导入环境:
https://github.com/smbache/import
此软件包也在CRAN上:
install.packages("import")
它允许导入包的选定,所有导出(“公共”)或所有(甚至不导出)功能。
示例:
import::from(dplyr, arrange, .into = "datatools")
import::from
函数是getExportedValue
的便捷包装。