[R] Help with non standard evaluation and require function

David Winsemius dwinsemius at comcast.net
Fri Aug 12 20:14:37 CEST 2016


> On Aug 12, 2016, at 8:57 AM, Luca Cerone <luca.cerone at gmail.com> wrote:
> 
> Hi everybody,
> I am having a hard time in understanding how to deal with non standard
> evaluation and the require function.
> 
> I asked about it on Stackoverflow at
> http://stackoverflow.com/questions/38922012/r-function-to-install-missing-packages,
> below you can find my question.

It was already explained and teh code of `require provided: `substitute` does not lookup values in the symbol table so the symbol: `pkgname` is converted by `as.character` to "pkgname", .... unless 'character.only' is TRUE.

What part of that is not understood?

-- 
David.
> 
> Thanks a lot for the help!
> Cheers,
> Luca
> 
> For one of my scripts I want to write an R function that checks if a
> package is already installed: if so it should use library() to import
> it in the namespace, otherwise it should install it and import it.
> 
> I assumed that pkgname is a string and tried to write something like:
> 
> ensure_library <- function(pkgname) {
>  if (!require(pkgname)) {
>    install.packages(pkgname, dependencies = TRUE)
>  }
>  require(pkgname)
> }
> 
> As simple as is this function does not work. If I try to run it like
> ensure_library("dplyr") it installs the package dplyr but then it
> fails because it trys to import pkgname rather than dplyr in the
> namespace.
> 
> ensure_library("dplyr")
> Loading required package: pkgname
> Installing package into ‘/home/luca/R-dev’
> (as ‘lib’ is unspecified)
> trying URL 'https://cran.rstudio.com/src/contrib/dplyr_0.5.0.tar.gz'
> Content type 'application/x-gzip' length 708476 bytes (691 KB)
> ==================================================
> downloaded 691 KB
> 
> * installing *source* package ‘dplyr’ ...
> ** package ‘dplyr’ successfully unpacked and MD5 sums checked
> ** libs
> 
> .... a lot of compiling here....
> 
> installing to /home/luca/R-dev/dplyr/libs
> ** R
> ** data
> *** moving datasets to lazyload DB
> ** inst
> ** preparing package for lazy loading
> ** help
> *** installing help indices
> ** building package indices
> ** installing vignettes
> ** testing if installed package can be loaded
> * DONE (dplyr)
> 
> The downloaded source packages are in
>    ‘/tmp/Rtmpfd2Lep/downloaded_packages’
> Loading required package: pkgname
> Warning messages:
> 1: In library(package, lib.loc = lib.loc, character.only = TRUE,
> logical.return = TRUE,  :
>  there is no package called ‘pkgname’
> 2: In library(package, lib.loc = lib.loc, character.only = TRUE,
> logical.return = TRUE,  :
>  there is no package called ‘pkgname’
> 
> Also, if I now re-run it it will install dplyr once again.
> 
> I realize this is probably due to R non-standard-evaluation and I have
> tried several combination of eval/substitute/quote in order to make it
> work with require but I couldn't succeed.
> 
> Can somebody help me understanding what is going on and if there is
> some easy-fix?
> 
> If a function already implementing this exists I would like to know,
> but what I am really interested is understanding why my code does not
> work as intended.
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list