[R] Help with non standard evaluation and require function

Luca Cerone luca.cerone at gmail.com
Fri Aug 12 17:57:48 CEST 2016


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.

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.



More information about the R-help mailing list