Skip to content

Instantly share code, notes, and snippets.

@RaghavendraP
Created March 29, 2018 20:45
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 RaghavendraP/eef2800c49b37a5f157c37954615cd9a to your computer and use it in GitHub Desktop.
Save RaghavendraP/eef2800c49b37a5f157c37954615cd9a to your computer and use it in GitHub Desktop.
Install a specific version of an R package (hack)
# Looks in the CRAN archive for the specified package and version. If
# the specified version is NULL or the same as the most recent version
# of the package, this function simply calls install.packages(). Otherwise,
# it looks at the list of archived source tarballs and tries to install
# an older version instead.
install.package.version <- function(
package,
version = NULL,
repos = getOption('repos'),
type = getOption("pkgType"))
{
contriburl <- contrib.url(repos, type)
available <- available.packages(contriburl)
if (package %in% row.names(available)) {
current.version <- available[package, 'Version']
if (is.null(version) || version == current.version) {
install.packages(package, repos = repos, contriburl = contriburl, type = type)
return()
}
}
con <- gzcon(url(sprintf("%s/src/contrib/Archive.rds", repos), "rb"))
archive <- readRDS(con)
close(con)
if (!(package %in% names(archive))) {
stop(sprintf("couldn't find package '%s'", package))
}
info <- archive[[package]]
if (is.null(version)) {
# Just grab the latest one. This will only happen if the package
# has been pulled from CRAN.
package.path <- info[length(info)]
} else {
package.path <- paste(package, "/", package, "_", version, ".tar.gz", sep="")
if (!(package.path %in% info)) {
stop(sprintf("version '%s' is invalid for package '%s'", version, package))
}
}
package.url <- sprintf("%s/src/contrib/Archive/%s", repos, package.path)
local.path <- file.path(tempdir(), basename(package.path))
if (download.file(package.url, local.path) != 0) {
stop("couldn't download file: ", package.url)
}
install.packages(local.path, repos = repos, type = type)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment