r - 导入包变量定义
问题描述
@import
在定义包变量时,以下是使用 roxygen 指令的正确方法吗?我怀疑不是,因为尝试使用该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)
}
解决方案
扩展我的评论,考虑将其更改为
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'))
```
推荐阅读
- php - 如何使用 PHP 将 HTML 输入框中的预填充值保存到文件中?
- laravel - Laravel SPA 与 Sanctum 并记住我在不活动后返回 419(CSRF 令牌不匹配)
- java - 计算器 (Android-Java)
- pandas - 如何为 Julia DashTables 使用格式
- react-native - 反应导航 v5 中的浮动中间选项卡
- google-workspace - 从 Google DriveFS 读取日志文件
- python - 熊猫:列中元素的位置条件
- c++ - 是否有使用 64 位整数快速计算两个模一个大素数的幂的技巧?
- c# - C# 控制台应用程序 - 请求被中止:无法使用 Restsharp 创建 SSL/TLS 安全通道
- ios - 如何对高比特率录音进行下采样?