有没有办法在加载包(但尚未附加)时从内存中的包自动加载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,我不确定是什么后果。
答案 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
中的DESCRIPTION
和importFrom(utils, data)
中的NAMESPACE
才能通过R CMD检查。
在我的情况下,我不需要数据对象对用户可见,我需要它对包中的一个函数可见。如果你需要它对用户可见,那将会更加困难(我认为),因为据我所知,你不能导出数据,只是函数。我想到导出数据的唯一方法是导出数据的包装函数。