将库加载到现有环境中(相当于“源”的“本地”参数)?

时间:2016-10-16 20:43:18

标签: r

我正在将生产中的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)

有办法做到这一点吗?

4 个答案:

答案 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的便捷包装。