首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为包变量定义导入

为包变量定义导入
EN

Stack Overflow用户
提问于 2019-06-16 04:32:46
回答 1查看 43关注 0票数 0

以下是定义包变量时使用roxygen @import指令的正确方法吗?我怀疑不会,因为尝试使用db函数会产生Error in connection_quote_identifier(conn@ptr, x) : Invalid connection

连接应该是有效的。我可以在包之外运行相同的代码(在调用library(dplyr);library(RPostgres)之后,它就可以工作了。

代码语言:javascript
复制
#' @import RPostgres
cxn <- dbConnect(Postgres(), service = 'plasticemission')

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

回答 1

Stack Overflow用户

发布于 2019-06-16 05:41:31

我的注释的扩展,请考虑将其更改为

代码语言:javascript
复制
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),如下所示:

代码语言:javascript
复制
# 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" (在本例中为逻辑选项)。选项的名称是完全任意的,您可以在这里执行各种灵活的操作,例如

代码语言:javascript
复制
.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)中,您可以设置

代码语言:javascript
复制
```lang-r

选项(mypackage.autocxn=列表(service=‘塑料发射’))

代码语言:javascript
复制
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56613967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档