【发布时间】:2014-06-22 19:24:08
【问题描述】:
有没有办法在包被加载(但尚未附加)时从内存中的包中自动加载data 对象? IE。与延迟加载相反?该对象在其中一个包函数中使用,因此它需要始终可用。
当包设置为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)
}
但这会导致大型数据对象的打包数据库很大,我不确定这样做的后果是什么。
【问题讨论】:
-
我很想知道答案!我正在使用
nloptr包,它在其功能之一中使用包数据,因此在加载包但未附加包时不起作用... -
你能在你的
.onLoad文件中使用data(mydata, package=pkg, environment=parent.env(environment()))吗? -
@BenBolker 这似乎有效。虽然感觉有点hacky。例如。当lazydata=true 时,R 将在附加包时用自己的版本覆盖mydata 对象。此外,数据对象不会自动对用户可见;您需要手动导出它。
-
如果您有
.Rprofile,您可以尝试if语句或那里的函数。
标签: r