每次加载包时自动运行一些设置代码(在 R 或 C++ 中)的正确方法是什么?理想情况下,所述代码将在用户执行后执行library(mypackage)
。现在,它包含在一个setup()
需要先运行一次的函数中。
只是为了更多的上下文,在我的具体情况下,我使用了一个使用glog的外部库,我需要执行google::InitGoogleLogging()
一次且仅一次。这有点尴尬,因为我试图在库中使用它,因为我必须这样做,即使它应该从main
.
只需阅读 'Writing R Extensions' 并按照提示进行操作 - 它是.onAttach()
或者.onLoad()
. 我有很多包在那里做一些小事情——这对 C++ 的调用(是否通过 Rcpp)并不重要,因为您只是询问在哪里初始化事物。
.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++ 代码)。关键是这些钩子保证你在包加载/附加时执行这是你想要的。