R 包开发中加载时设置的正确做法
Proper practice for setup upon load in R package development
每次加载包时自动 运行 设置一些设置代码(R 或 C++)的正确方法是什么?理想情况下,所述代码将在用户执行 library(mypackage)
后执行。现在,它包含在 setup()
函数中,需要先 运行 一次。
只是为了了解更多上下文,在我的具体情况下,我正在使用一个使用 glog and I need to execute google::InitGoogleLogging()
once and only once. It's slightly awkward because I'm trying to use it 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)
}
我有一些(不是 public)代码以相同的方式设置专有数据库的句柄(使用 C++ 代码)。关键是这些挂钩 保证你 在包加载/附加时执行,这就是你想要的。
每次加载包时自动 运行 设置一些设置代码(R 或 C++)的正确方法是什么?理想情况下,所述代码将在用户执行 library(mypackage)
后执行。现在,它包含在 setup()
函数中,需要先 运行 一次。
只是为了了解更多上下文,在我的具体情况下,我正在使用一个使用 glog and I need to execute google::InitGoogleLogging()
once and only once. It's slightly awkward because I'm trying to use it 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)
}
我有一些(不是 public)代码以相同的方式设置专有数据库的句柄(使用 C++ 代码)。关键是这些挂钩 保证你 在包加载/附加时执行,这就是你想要的。