我正在开发的 R 包需要几个 R 数据对象,例如预先计算的模型和参数。
目前,我在单个 .RData 文件中的包的“数据”目录中拥有每个对象。使用包时,用户可以使用“数据”功能将这些对象附加到他们的环境中。
相反,我想要的行为是在加载包时,数据对象会自动附加到内部包环境,用户无法直接访问。
我的理解是,将“sysdata.rda”文件放在包含当前在“数据”中的对象的包的“R”目录中会给我想要的结果。但是,有没有办法做到这一点,以便我可以将每个对象放在单独的文件中而不是组合在一起?
将你的sysdata.rda
文件放在你data
的包的目录中。
不要使用惰性数据——你的说明文件不应该有一个惰性数据行,或者,如果有,它应该是LazyData: no
在包的 R 目录中的任何 .R 文件中添加这样的行
data(sysdata, envir=environment())
我创建了一个data.frame
命名sysdata
并将其保存到一个名为
sysdata.rda
的包的数据目录中的文件中anRpackage
我将上述行添加到 .R 文件中,还添加了这个未导出的函数,只是为了表明包中的函数可以访问数据。
foo <- function() tail(sysdata, 2)
然后我看到以下 R 会话
> 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
因此,用户仍然可以访问数据,但正如您所要求的,他们没有直接访问权限。用户仍然可以选择运行data(sysdata)
。
您可以在加载包时使用.onLoad()
钩子调用data()
,并将包命名空间指定为加载数据对象的环境。
假设你有文件model1.R
并且mydata.RData
在data/
你的包的目录中foopkg
,定义函数
.onLoad <- function(libname, pkgname) {
data("model1", "mydata", package=pkgname, envir=parent.env(environment()))
}
在您的包裹中的某处(例如 in foopkg-package.R
)。
构建和安装包后,
> library(foopkg)
> ls(loadNamespace("foopkg"))
应该证明各种数据对象已成功加载到包命名空间中,即对包中的函数可见但不会污染全局环境。