在我的R包中包括数据库连接

问题描述 投票:1回答:1

[每天,我从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-package中实现此功能?我正在使用ROracle,但这与其他odbc数据库连接应该是相同的过程。

r odbc dbi dbplyr roracle
1个回答
0
投票

虽然我同意@ 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) 
© www.soinside.com 2019 - 2024. All rights reserved.