如何处理包内部的R数据?

时间:2012-03-01 17:30:12

标签: r load package internal rda

我正在开发的R包需要几个R数据对象,例如预先计算的模型和参数。

目前,我在包的'data'目录中将每个对象放在单独的.RData文件中。使用包时,用户可以使用“数据”功能将这些对象附加到其环境中。

我想要的行为是,在加载包时,数据对象会自动附加到内部包环境,而用户无法直接访问。

我的理解是将'sysdata.rda'文件放在包含当前在'data'中的对象的包的'R'目录中将给出我想要的结果。但是,有没有办法做到这一点,以便我可以将每个对象放在一个单独的文件而不是组合在一起?

2 个答案:

答案 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.RDatadata/文件foopkg,请定义函数

.onLoad <- function(libname, pkgname) {
  data("model1", "mydata", package=pkgname, envir=parent.env(environment()))
}

包裹中的某个地方(例如foopkg-package.R)。

构建并安装软件包后,

> library(foopkg)
> ls(loadNamespace("foopkg")) 

应该证明各种数据对象已成功加载到包命名空间中,即包中的函数可见,但不会污染全局环境。