我正在开发的R包需要几个R数据对象,例如预先计算的模型和参数。
目前,我在单个.RData文件的包的“数据”目录中具有每个对象。使用软件包时,用户可以使用“数据”功能将这些对象附加到他们的环境中。
相反,我想要的行为是,在加载包时,数据对象会自动附加到内部包环境中,并且用户无法直接访问。
我的理解是,将“sysdata.rda”文件放在包含“数据”中当前对象的程序包的“R”目录中,将为我提供所需的结果。但是,有没有一种方法可以使每个对象放在单独的文件中而不是分组在一起?
最佳答案
您可以在加载包时使用.onLoad()
挂钩调用data()
,并将包 namespace 指定为将数据对象加载到的环境。
假设您的软件包的model1.R
目录中有名为mydata.RData
的文件data/
和foopkg
,请定义函数
.onLoad <- function(libname, pkgname) {
data("model1", "mydata", package=pkgname, envir=parent.env(environment()))
}
包裹中的某处(例如
foopkg-package.R
中)。构建并安装软件包后,
> library(foopkg)
> ls(loadNamespace("foopkg"))
应该证明各种数据对象已成功加载到包 namespace 中,即对包中的函数可见,但不会污染全局环境。