每次加载包时自动运行一些设置代码(在 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/