install.packages()
returns a warning if a package cannot be installed (for instance, if it is unavailable); for example:
install.packages(\"nota
Expanding on the quick comment:
R> AP <- available.packages()
R> "notapackage" %in% AP[,1] # expected to yield FALSE
[1] FALSE
R> "digest" %in% AP[,1] # whereas this should be TRUE
[1] TRUE
R>
The R function WithCallingHandlers()
lets us handle any warnings with an explicitly defined function. For instance, we can tell the R to stop if it receives any warnings (and return the warning message as an error message).
withCallingHandlers(install.packages("notapackage"),
warning = function(w) stop(w))
I am guessing that this is not ideal, since presumably a package could install successfully but still throw a warning; but haven't encountered that case. As Dirk suggests, testing require
for the package is probably more robust.
Having just solved this for myself, I noted that install.packages() results in calling library(thepackage) to see it its usable.
I made a R script that installs the given packages, uses library
on each to see if its loadable, and if not calls quit
with a non-0 status.
I call it install_packages_or_die.R
#!/usr/bin/env Rscript
packages = commandArgs(trailingOnly=TRUE)
for (l in packages) {
install.packages(l, dependencies=TRUE, repos='https://cran.rstudio.com/');
if ( ! library(l, character.only=TRUE, logical.return=TRUE) ) {
quit(status=1, save='no')
}
}
Use it like this in your Dockerfile. I'm grouping them in useful chunks to try and make reasonable use of Docker build cache.
ADD install_packages_or_die.R /
RUN Rscript --no-save install_packages_or_die.R profvis devtools memoise
RUN Rscript --no-save install_packages_or_die.R memoise nosuchpackage
Disclaimer: I do not consider myself an R programmer at all currently, so there may very well be better ways of doing this.