импорт для определения переменной пакета - PullRequest
0 голосов
/ 15 июня 2019

Является ли следующий правильный способ использования директивы roxygen @import при определении переменных пакета? Я подозреваю, что нет, потому что попытка использовать функцию db дает Error in connection_quote_identifier(conn@ptr, x) : Invalid connection.

Соединение должно быть действительным. Я могу запустить тот же код за пределами пакета (после вызова library(dplyr);library(RPostgres), и он работает.

#' @import RPostgres
cxn <- dbConnect(Postgres(), service = 'plasticemission')

#' @import dplyr
#' @export
db <- function(name) {
  tbl(cxn, name)
}

1 Ответ

1 голос
/ 16 июня 2019

Расширение моего комментария, рассмотрите возможность его изменения на

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'))
```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...