导入包变量定义

时间:2019-06-15 20:32:46

标签: r roxygen2 r-dbi

以下是在定义包变量时使用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 个答案:

答案 0 :(得分:1)

我的评论的扩展名,请考虑将其更改为

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'))
```