我正在开发的R包需要几个R数据对象,例如预先计算的模型和参数。
目前,我在包的'data'目录中将每个对象放在单独的.RData文件中。使用包时,用户可以使用“数据”功能将这些对象附加到其环境中。
我想要的行为是,在加载包时,数据对象会自动附加到内部包环境,而用户无法直接访问。
我的理解是将'sysdata.rda'文件放在包含当前在'data'中的对象的包的'R'目录中将给出我想要的结果。但是,有没有办法做到这一点,以便我可以将每个对象放在一个单独的文件而不是组合在一起?
答案 0 :(得分:14)
将您的sysdata.rda
文件放在软件包的data
目录中。
不要使用延迟数据 - 您的DESCRIPTION文件应该没有行
LazyData,或者,如果是,它应该是LazyData: no
在包的R目录中的任何.R文件中添加一行,如下所示
data(sysdata, envir=environment())
我创建了一个名为data.frame
的{{1}}并将其保存到名为的文件中
sysdata
sysdata.rda
我将以上行添加到.R文件中,并添加了此未导出的函数 只是为了表明包中的函数可以访问数据。
anRpackage
然后我看到以下的R会话
foo <- function() tail(sysdata, 2)
因此,用户仍然可以访问数据,但是根据您的要求,他们没有直接访问权限。用户仍然可以选择运行> library(anRpackage)
> sysdata
Error: object 'sysdata' not found
> anRpackage:::sysdata
A B C
1 1 6 a
2 2 7 b
3 3 8 c
4 4 9 d
5 5 10 e
> anRpackage:::foo()
A B C
4 4 9 d
5 5 10 e
。
答案 1 :(得分:11)
您可以在加载包时使用.onLoad()
挂钩调用data()
,并将包命名空间指定为将数据对象加载到的环境。
假设您的程序包的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"))
应该证明各种数据对象已成功加载到包命名空间中,即包中的函数可见,但不会污染全局环境。