在我的 R 包中包含数据库连接
Include Database Connection in my R package
每天,我都会从 R 中连接到公司数据库。目前,我有一个 R 脚本,它可以建立连接并进行所有预分析数据准备(变异和连接)。我想将它包含在一个 R 包中 DWH
,这样我就可以与同事分享这个过程。
下面是一些示例代码:
creds <- read.csv2('C:/creds.csv')
con <- ROracle::dbConnect(drv = DBI::dbDriver("Oracle"),
username = creds$user, password= creds$pwd,
dbname = 'DWH',
prefetch = FALSE, bulk_read = 1000L, stmt_cache = 0L,
external_credentials = FALSE, sysdba = FALSE)
PREST <- dplyr::tbl(con, dbplyr::in_schema('ADWH', 'PREST')) %>%
transmute(date = A_DWH_DATE_TODAY,
amount = A_DWH_POL_IND_COLL_AMOUNT)
理想情况下,我想用 library(DWH)
加载包,然后 PREST
对象应该可供所有人进一步使用,例如
library(DWH)
PREST %>% filter(date > 201912)
这在采购 R 脚本时非常有效。我如何在 R 包中实现它?
我正在使用 ROracle,但这应该与任何其他 odbc 数据库连接的过程相同。
虽然我同意 @r2evans 的观点,这不是一个好的设计决策,但如果您致力于以这种方式进行,您可以采用的方法是将变量分配给全局环境的函数(根据 this问题)。
这看起来像:
create_globals = function(){
creds <- read.csv2('C:/creds.csv')
con <- ROracle::dbConnect(drv = DBI::dbDriver("Oracle"),
username = creds$user, password= creds$pwd,
dbname = 'DWH',
prefetch = FALSE, bulk_read = 1000L, stmt_cache = 0L,
external_credentials = FALSE, sysdba = FALSE)
PREST <- dplyr::tbl(con, dbplyr::in_schema('ADWH', 'PREST')) %>%
transmute(date = A_DWH_DATE_TODAY,
amount = A_DWH_POL_IND_COLL_AMOUNT)
assign("creds", cred, envir = .GlobalEnv)
assign("con", con, envir = .GlobalEnv)
assign("PREST", PREST, envir = .GlobalEnv)
}
然后你的包使用看起来像:
library(DWH)
create_globals()
PREST %>% filter(date > 201912)
每天,我都会从 R 中连接到公司数据库。目前,我有一个 R 脚本,它可以建立连接并进行所有预分析数据准备(变异和连接)。我想将它包含在一个 R 包中 DWH
,这样我就可以与同事分享这个过程。
下面是一些示例代码:
creds <- read.csv2('C:/creds.csv')
con <- ROracle::dbConnect(drv = DBI::dbDriver("Oracle"),
username = creds$user, password= creds$pwd,
dbname = 'DWH',
prefetch = FALSE, bulk_read = 1000L, stmt_cache = 0L,
external_credentials = FALSE, sysdba = FALSE)
PREST <- dplyr::tbl(con, dbplyr::in_schema('ADWH', 'PREST')) %>%
transmute(date = A_DWH_DATE_TODAY,
amount = A_DWH_POL_IND_COLL_AMOUNT)
理想情况下,我想用 library(DWH)
加载包,然后 PREST
对象应该可供所有人进一步使用,例如
library(DWH)
PREST %>% filter(date > 201912)
这在采购 R 脚本时非常有效。我如何在 R 包中实现它? 我正在使用 ROracle,但这应该与任何其他 odbc 数据库连接的过程相同。
虽然我同意 @r2evans 的观点,这不是一个好的设计决策,但如果您致力于以这种方式进行,您可以采用的方法是将变量分配给全局环境的函数(根据 this问题)。
这看起来像:
create_globals = function(){
creds <- read.csv2('C:/creds.csv')
con <- ROracle::dbConnect(drv = DBI::dbDriver("Oracle"),
username = creds$user, password= creds$pwd,
dbname = 'DWH',
prefetch = FALSE, bulk_read = 1000L, stmt_cache = 0L,
external_credentials = FALSE, sysdba = FALSE)
PREST <- dplyr::tbl(con, dbplyr::in_schema('ADWH', 'PREST')) %>%
transmute(date = A_DWH_DATE_TODAY,
amount = A_DWH_POL_IND_COLL_AMOUNT)
assign("creds", cred, envir = .GlobalEnv)
assign("con", con, envir = .GlobalEnv)
assign("PREST", PREST, envir = .GlobalEnv)
}
然后你的包使用看起来像:
library(DWH)
create_globals()
PREST %>% filter(date > 201912)