Skip to content

Instantly share code, notes, and snippets.

@leoluyi
Forked from cannin/installPackages.R
Last active May 13, 2020 10:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leoluyi/10888517e7833971ae0d375f40afdbb0 to your computer and use it in GitHub Desktop.
Save leoluyi/10888517e7833971ae0d375f40afdbb0 to your computer and use it in GitHub Desktop.
Install/update necessary packages from CRAN, Bioconductor, GitHub, or local source given a vector of strings with names of packages or file paths
#' Install/update necessary packages from CRAN, GitHub
#'
#' @param packages a vector of strings with names of packages from CRAN, Bioconductor, GitHub
#' @param file a file with packages; overrides packages parameter
#' @param update_packages whether to update existing packages (Default: FALSE)
#' @param repos the CRAN repository to use
#' @param dry_run whether to test for missing packages (Default: FALSE)
#'
#' @example
#' \dontrun {
#' source("https://gist.githubusercontent.com/cannin/6b8c68e7db19c4902459/raw/installPackages.R")
#' install_requirements("r-requirements.txt")
#' }
install_requirements <- function(
file=NULL, packages=NULL, update_packages=FALSE, type=getOption("pkgType"),
repos=NULL, dry_run=FALSE) {
# file = "R-requirements.txt"
# setRepositories(ind=1:6)
available_packages <- rownames(available.packages())
installed_packages <- rownames(installed.packages())
if (!is.null(repos)) {
options(repos=repos, unzip="internal") # unzip needed for Ubuntu
}
# Install packages
if(!is.null(file)) {
packages <- read.table(file, stringsAsFactors = FALSE, encoding = "UTF-8")
packages <- packages$V1
cat("Packages:", fill = TRUE)
cat(packages, sep=", ", fill = TRUE)
}
if("devtools" %in% rownames(installed.packages())) {
require(devtools)
} else {
install.packages("devtools")
require(devtools)
}
if("stringr" %in% rownames(installed.packages())) {
require(stringr)
} else {
install_cran("stringr")
require(devtools)
}
if(!dryRun) {
for(package in packages) {
tmp <- strsplit(package, .Platform$file.sep)[[1]]
package_name <- tmp[length(tmp)]
if(!(package_name %in% installed_packages)) {
tryCatch({
if(package %in% available_packages) {
if(update_packages) {
cat("Update packages ...", fill = TRUE)
update.packages(ask = FALSE)
}
install_cran(package, type=type)
} else if(str_count(package, '/') == 1) {
if(str_count(package, 'github') == 1) {
tmpPkg <- strsplit(package, ":")[[1]][2]
cat("install_github:", tmpPkg, fill = TRUE)
install_github(tmpPkg, upgrade=update_packages)
} else if(str_count(package, 'bitbucket') == 1) {
tmpPkg <- strsplit(package, ":")[[1]][2]
cat("install_bitbucket", tmpPkg, fill = TRUE)
install_bitbucket(tmpPkg, upgrade=update_packages)
} else {
cat("install_github:", package, fill = TRUE)
install_github(package, upgrade=update_packages)
}
} else if(str_count(package, .Platform$file.sep) > 1) {
install(package, type="source")
} else {
cat("ERROR: Package: ", package, "\n")
}
# Try to test if rJava worked
# NOTE: Requires additional steps: https://stackoverflow.com/questions/30738974/rjava-load-error-in-rstudio-r-after-upgrading-to-osx-yosemite
if(packageName == "rJava") {
library(rJava)
.jinit()
}
}, error = function(e) {
cat("ERROR: Package: ", package, ". Message: ", message(e), "\n")
})
} else {
cat("Already installed: ", package, "\n")
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment