加载包时加载数据对象

时间:2014-06-22 19:24:08

标签: r

有没有办法在加载包(但尚未附加)时从内存中的包自动加载data对象?即延迟加载的反面?该对象用于其中一个包函数中,因此需要始终可用。

当包设置为lazydata=false时,包根本不会导出数据对象,需要使用data()手动加载。我们可以使用类似的东西:

.onLoad <- function(lib, pkg){
  data(mydata, package = pkg)
}

但是,data()会在全局环境中加载对象。我更喜欢在包环境中加载它(这是lazydata所做的)以防止屏蔽冲突。

解决方法是完全绕过data机制,并简单地对包中的对象进行硬编码。所以包myscore.R看起来像

mymodel <- readRDS("inst/mymodel.rds")
myscore <- function(newdata){
  predict(mymodel, newdata)
}

但这会导致大型数据对象的巨大packagedb,我不确定是什么后果。

2 个答案:

答案 0 :(得分:4)

正如你所说

  

该对象用于其中一个包函数,因此需要始终可用。

我认为该软件包的作者应该 NOT 使用data(.)。 相反,他应该通过R / *。R文件中的简单R代码在他/ R /中定义对象, 或者使用sysdata.rda方法,在所有这些问题的着名的第一个参考文献中解释, "Writing R Extensions"。在这两种情况下,包作者还可以导出对象,这通常是其他用户所希望的对象。

当然,这需要您和软件包作者之间的礼貌对话,并且只适用于该软件包的下一个版本。

答案 1 :(得分:2)

我要发布这个,因为它似乎适用于我的用例。

.onLoad()是:

 function(lib,pkg)
    data(mydata, package=pkg, 
           environment=parent.env(environment()))

还需要Imports: utils中的DESCRIPTIONimportFrom(utils, data)中的NAMESPACE才能通过R CMD检查。

在我的情况下,我需要数据对象对用户可见,我需要它对包中的一个函数可见。如果你需要它对用户可见,那将会更加困难(我认为),因为据我所知,你不能导出数据,只是函数。我想到导出数据的唯一方法是导出数据的包装函数。