Включить соединение с базой данных в мой пакет R - PullRequest
1 голос
/ 30 апреля 2020

Каждый день я подключаюсь к корпоративной базе данных изнутри 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-пакета? Я использую R Oracle, но это должен быть тот же процесс, что и для любого другого соединения с базой данных odb c.

1 Ответ

0 голосов
/ 03 мая 2020

Хотя я согласен с @ 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) 
...