Расширение моего комментария, рассмотрите возможность его изменения на
cxn <- NULL
#' @param name character, name of the table
#' @param cxn database (DBI) connection object
#' @import DBI
#' @import RPostgres
#' @import dplyr
#' @export
db <- function(name, cxn = cxn) {
if (missing(cxn) && is.null(cxn)) {
cxn <<- DBI::dbConnect(RPostgres::Postgres(), service = 'plasticemission')
}
dplyr::tbl(cxn, name)
}
Таким образом, вы не пытаетесь создать экземпляр подключения при загрузке пакета, а только при вызове функции. Я предоставил в вызове переопределяемую переменную cxn
на случай, если вам когда-нибудь понадобятся множественные, временные или нестандартные соединения.
Если вы действительно хотите, чтобы он был подключен сразу после загрузки пакета, рассмотрите возможность использования .onLoad
(или .onAttach
), например:
# it might be better defined here, not in your other function, but once is enough
cxn <- NULL
.onLoad <- function(libname, pkgname) {
if (getOption("mypackage.autocxn", default = FALSE)) {
if (is.null(cxn)) {
cxn <<- DBI::dbConnect(RPostgres::Postgres(), service = 'plasticemission')
}
}
}
В этом случае для автоматического подключения было установлено явное требование установить глобальную опцию "mypackage.autocxn"
(в данном случае как логическую). Название опции совершенно произвольно, и вы можете делать здесь все гибкие вещи, такие как
.onLoad <- function(libname, pkgname) {
if (length(opts <- getOption("mypackage.autocxn", default = NULL)) &&
is.null(cxn)) {
cxn <<- do.call(DBI::dbConnect, c(list(drv = RPostgres::Postgres()), args))
}
}
А где-то в вашей личной настройке (возможно, ~/.Rprofile
) вы можете установить
```lang-r
options(mypackage.autocxn = list(service = 'plasticemission'))
```