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

use*_*581 1 c++ r rcpp glog

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

只是为了更多的上下文,在我的具体情况下,我正在使用一个使用glog的外部库,我只需执行google::InitGoogleLogging()一次.它有点尴尬,因为我试图在库中使用它,因为我必须,即使它应该从一个调用main.

Dir*_*tel 5

只需阅读'写R扩展'并按照线索 - 它是.onAttach()或者.onLoad().我有很多在那里做一些小事情的软件包 - 这对C++的调用(通过Rcpp与否)并不重要,因为你只是在询问在哪里初始化东西.

示例: Rblpapi创建连接并存储它

.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)
}
Run Code Online (Sandbox Code Playgroud)

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