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

frédéric Clement f.clems at gmail.com
Thu Aug 10 14:10:38 CEST 2017


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:
>>> # Generated by roxygen2: do not edit by hand

regards
frederic


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

> On 04/08/2017 5:51 AM, frédéric Clement wrote:
> > 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"))
> > }
>
> 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.
>
>
> >
> >
> > ## 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")
> > }
>
> 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.
>
> >
> > #' 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
> > }
>
> Not sure why you'd want these 13 lines instead of editing your NAMESPACE
> file, but that's your choice...
>
> Duncan Murdoch
>
> >
> > --- 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
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-package-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-package-devel
> >
>
>

	[[alternative HTML version deleted]]



More information about the R-package-devel mailing list