【问题标题】:Load data object when package is loaded加载包时加载数据对象
【发布时间】: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


【解决方案1】:

如你所说

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

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

当然,这需要你和包作者之间有礼貌的交谈,并且只适用于该包的下一个版本。

【讨论】:

    【解决方案2】:

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

    .onLoad() 是:

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

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

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

    【讨论】:

    • 如果你使用这个解决方案,请确保你没有设置lazyData=true,因为一旦包被附加,R 会用它自己的版本覆盖mydata
    • 嗯。我不确定我是否理解这里的问题(也许它不适用于我的用例?),但我会考虑一下......
    • 如果数据对包可见但对用户不可见,那么您应该使用sysdata.rda 而不是data/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多