R包开发中加载时设置的正确做法

Proper practice for setup upon load in R package development

本文关键字:设置 加载 包开发 开发      更新时间:2023-10-16

在每次加载包时自动运行一些设置代码(R或C++)一次的正确方法是什么?理想情况下,所述代码将在用户执行library(mypackage)之后执行。现在,它包含在一个setup()函数中,该函数需要在执行其他操作之前先运行一次。

只是为了获得更多上下文,在我的特定情况下,我使用的是一个使用glog的外部库,并且我需要执行google::InitGoogleLogging()一次,而且只执行一次。这有点尴尬,因为我试图在库中使用它,因为我必须这样做,即使它应该从main调用。

只需阅读"编写R扩展"并遵循线索即可--它要么是.onAttach(),要么是.onLoad()。我有很多包在那里做一些小事情——对C++的调用(是否通过Rcpp)并不重要,因为你只是在问在哪里初始化。

示例:Rlpapi创建一个连接并将其存储为

.pkgenv <- new.env(parent=emptyenv())
.onAttach <- function(libname, pkgname) {
    if (getOption("blpAutoConnect", FALSE)) {
        con <- blpConnect()
        if (getOption("blpVerbose", FALSE)) {
            packageStartupMessage(paste0("Created and stored default connection object ",
                                         "for Rblpapi version ",
                                         packageDescription("Rblpapi")$Version, "."))
        }
    } else {
        con <- NULL
    }
    assign("con", con, envir=.pkgenv)
}

我有一些(非公开的)代码以同样的方式设置了一个专有数据库的句柄(使用C++代码)。关键是这些钩子保证在包加载/附加时执行,这正是您想要的。