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
[R-pkg-devel] DBI connection at package load
3 messages · frédéric Clement, Duncan Murdoch
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
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:
# 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