【问题标题】:How do you handle R Data internal to a package?您如何处理包内部的 R 数据?
【发布时间】:2012-03-20 05:32:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么要把每个对象放在一个单独的文件中,为什么不单独引用每个对象呢?例如,packagename:::apackagename:::b
  • @the_skua 单独的文件有助于简化包中的文件版本管理。这是不久前的事了,但我认为我有不同的模型配合作为包的一部分,有时我们想更新其中一个但不是全部。

标签: r load package internal rda


【解决方案1】:

把你的sysdata.rda文件放到你包的data目录下。

不要使用惰性数据——你的DESCRIPTION文件不应该有一行 LazyData,或者,如果是,它应该是LazyData: no

在包的 R 目录中的任何 .R 文件中添加这样一行

data(sysdata, envir=environment())

我创建了一个名为 sysdatadata.frame 并将其保存到一个名为 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)

【讨论】:

  • 此回复未回答问题。我问的是关于将数据划分为不同文件的问题,而不是关于数据可访问性范围的问题。
  • 您说您目前在数据目录中有很多数据文件。因此,为这些数据文件中的每一个添加类似data(sysdata, envir=environment()) 的行,这样它们将“自动附加到内部包环境,用户无法直接访问”。请说明你想要什么。
【解决方案2】:

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

假设您在名为foopkg 的包的data/ 目录中有文件model1.Rmydata.RData,请定义函数

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

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

构建和安装包后,

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2019-01-02
    • 2010-11-15
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多