Skip to content

[R-pkg-devel] DBI connection at package load

3 messages · frédéric Clement, Duncan Murdoch

#
Hello,

I want to use a package to load and set up a working environment (Only
intern used). It has function, but also create a connection object
(RPostgreSQL) to make dplyr::tbl implicitely use this connection.

After trying to save the connection object in "Data\"... and failed. I made
the following work around.

Is it the right way to do it, or should it be solved in other ways.

PS: This is my first attent at package development experience, I mainly
follow http://r-pkgs.had.co.nz/

regards

frederic Clement

----- the script----

.onAttach <- function(libname = find.package("dbName"), pkgname = "dbName")
{
  packageStartupMessage("Intranet Company required")

  dbNameConPool = dbName_create_pool()
  assign("dbNameConPool", dbNameConPool, envir =
as.environment("package:dbName"))
}


## This is a function so that I can call it in .onAttach
##
dbName_create_pool = function(){

    DBI::dbConnect(drv = RPostgreSQL::PostgreSQL(),
                 user = "dbName",
                 password = .rs.askForPassword("Enter password:"),
                 port = 0000,
                 host = "dbName-int.company.com")
}


#' Dummy function
#'
#' Only used for package build purpose
#'     to import the usefull function.
#' @return NULL
#' @export
#' @import dplyr dbplyr DBI magrittr RPostgreSQL tidyr
#'
#' @examples
#' fun_import()
fun_import <- function(){
  NULL
}

--- session

R version 3.4.1 (2017-06-30)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252
LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
LC_TIME=German_Germany.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] compiler_3.4.1 tools_3.4.1
#
On 04/08/2017 5:51 AM, fr?d?ric Clement wrote:
Usually you should use .onLoad, not .onAttach.  If someone who hasn't 
attached your package calls one of the functions using dbName::fn(...),
your package will be loaded but not attached.  Similarly if another 
package imports one of your functions.
However, for this particular use, it might be bad to put the code even 
in .onLoad.  A better way to go would be to have a function in your 
package that calls dbName_create_pool the first time you call it, and 
just returns the same value on subsequent calls.  For example,

getcon <- local({
   con <- NULL
   function() {
     if (is.null(con))
       con <<- dbName_create_pool()
     con
   }})


This way nobody is prompted for a password unless they actually need to 
access the database.
Not sure why you'd want these 13 lines instead of editing your NAMESPACE 
file, but that's your choice...

Duncan Murdoch
5 days later
#
hi duncan,
Thank you, it refreshed my memories on "local", cool.

About the dummy function to load packages, it lets Rstudio bring them in
the Namespace, kind of a tradeoff because of the warning I get in NAMESPACE
after building the documentation:
regards
frederic


On Fri, Aug 4, 2017 at 4:19 PM Duncan Murdoch <murdoch.duncan at gmail.com>
wrote: