33

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

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

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

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

4

2 回答 2

15

将你的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)

于 2012-09-07T21:53:36.600 回答
12

您可以在加载包时使用.onLoad()钩子调用data(),并将包命名空间指定为加载数据对象的环境。

假设你有文件model1.R并且mydata.RDatadata/你的包的目录中foopkg,定义函数

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

在您的包裹中的某处(例如 in foopkg-package.R)。

构建和安装包后,

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

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

于 2013-05-03T09:20:23.827 回答