1

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

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

4

1 回答 1

5

只需阅读 'Writing R Extensions' 并按照提示进行操作 - 它是.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)
}

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

于 2016-03-31T00:09:05.283 回答