每个程序包加载一次自动运行一些设置代码(在R或C ++中)的正确方法是什么?理想情况下,一旦用户执行library(mypackage)
,所述代码就会执行。现在,它包含在setup()
函数中,需要先运行一次。
仅针对更多情况,在我的具体情况下,我使用的是使用glog的外部库,我需要执行google::InitGoogleLogging()
一次且仅执行一次。这有点尴尬,因为我试图使用它within a library,因为我必须这样做,即使它应该是从main
调用的。
答案 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 ++代码)到专有数据库。关键是这些钩子保证你在包加载/附加上执行,这就是你想要的。