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

标签 c++ r rcpp glog

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

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

最佳答案

只需阅读“Writing R Extensions”并遵循线索——它是 .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++ 代码)。关键是这些 Hook 保证您在包加载/附加时执行,这正是您在这里想要的。

关于c++ - R 包开发中加载时设置的正确做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36321864/

相关文章:

c++ - 有没有办法在 C++ 中实现 Python 的 'separator' .join() 的模拟?

使用 R 替换包含 NA 的数据框中多列的异常值

c++ - R 数值 vector 列表 -> C++ 2d array with Rcpp

r - 在 R 中运行 Rcpp cde 时出现 "not a matrix"错误

c++ - C++ 协方差/覆盖/循环问题

c++ fstream read()函数不起作用

c++ - 有没有办法在 C++ 中制作无锁 "counter"随机访问迭代器?

python - 如何解压文件并访问其中的所有文件夹和子文件夹并创建数据框?

r - ggplot2图例到底部和水平

c++ - Rcpp并行: Converting CharacterMatrix to RMatrix<T>