【问题标题】:.First.lib idiom in R packagesR 包中的 .First.lib 习惯用法
【发布时间】:2010-12-06 17:50:35
【问题描述】:

我在很多 R 包的 .First.lib 函数中看到以下成语:

fullName <- paste("package", pkgname, sep=":")
myEnv <- as.environment(match(fullName, search()))
barepackage <- sub("([^-]+)_.*", "\\1", pkgname)
dbbase <- file.path(libname, pkgname, "R", barepackage)
rm(.First.lib, envir = myEnv)
lazyLoad(dbbase, myEnv)
if(exists(".First.lib", envir = myEnv, inherits = FALSE)) {
    f <- get(".First.lib", envir = myEnv, inherits = FALSE)
    if(is.function(f))
        f(libname, pkgname)
    else
        stop(gettextf("package '%s' has a non-function '.First.lib'",
                      pkgname),
             domain = NA)
}

我了解 .First.lib 函数在加载包时运行。

我知道上面的代码为包定义了一个环境并设置了一个路径,但我不明白为什么它在显式删除 .First.lib 函数后寻找 .First.lib 函数。是什么让上述成语如此普遍?将其包含在 R 包中是否是“最佳实践”?

【问题讨论】:

    标签: r packages


    【解决方案1】:

    这种成语很古老。包应该有命名空间并使用 .onLoad、.onUnload 和 .onAttach。例如:

    .onLoad <- function(libname, pkgname){
         # do whatever needs to be done when the package is loaded
         # some people use it to bombard users with 
         # messages using 
         packageStartupMessage( "my package is so cool" )
         packageStartupMessage( "so I will print these lines each time you load it")
    }
    

    只需将其添加到DESCRIPTION文件中,最好避免调用lazyLoad函数的整个业务:

    LazyLoad: true
    

    【讨论】:

      【解决方案2】:

      你问为什么它在寻找.First.Lib,而脚本之前删除了它。 lazyLoad 加载 R 对象的数据库,在上面的代码中,它被加载到环境 myEnv 中。加载到该环境中的对象集包含.First.Lib 并非不可想象,而代码正在寻找的正是它。事实上,我猜想这样做的目的是运行存储在加载的对象数据库中的.First.Lib

      没有 NAMESPACE 的包中的另一个常见习语是(来自 vegan 包):

      .First.lib <- function(lib, pkg)  {
          library.dynam("vegan", pkg, lib)
          packageStartupMessage("This is vegan ",
                                utils::packageDescription("vegan", field="Version"),
                                appendLF = TRUE)
      }
      

      这会加载已编译的代码以供使用,并打印带有包名称和版本号的简单启动消息。这在精神上类似于@Romain 的答案的.onLoad,但没有 NAMESPACE。

      【讨论】:

      • NAMESPACE 的使用非常简单,而且很有用。在这里它给你 useDynLib 来加载编译的代码
      • @Romain:谢谢,是的。我正在将 NAMESPACE 添加到我编写的两个包中。上次我与 vegan 的首席开发人员交谈时,他坚决反对在软件包中添加一个。虽然包不需要 NAMESPACE 文件来通过 R CMD 检查,但我认为值得记录一个比@JD Long 在他的 Q 中显示的更简单的.First.lib
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多