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

时间:2016-03-30 23:57:24

标签: c++ r rcpp glog

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

仅针对更多情况,在我的具体情况下,我使用的是使用glog的外部库,我需要执行google::InitGoogleLogging()一次且仅执行一次。这有点尴尬,因为我试图使用它within a library,因为我必须这样做,即使它应该是从main调用的。

1 个答案:

答案 0 :(得分:5)

只需阅读“编写R扩展程序”并按照潜在客户进行操作即可:.onAttach().onLoad()。我有很多在那里做一些小事情的软件包 - 这对C ++的调用(通过Rcpp或不通过)并不重要,因为你只是在询问在哪里初始化东西。

示例: Rblpapi creates a connection and stores it

.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 ++代码)到专有数据库。关键是这些钩子保证你在包加载/附加上执行,这就是你想要的。