Start by creating the recursive dependency tree for your target packages.
For example, imagine a scenario where you want to create a repository
that consists of the package
foreach and its
Start by creating the dependency list:
library("miniCRAN") # use Revolution Analytics CRAN mirror <- c(CRAN = "http://cran.microsoft.com") revolution # Specify list of packages to download <- c("foreach") pkgs <- pkgDep(pkgs, repos = revolution, type = "source", suggests = FALSE, pkgList availPkgs = cranJuly2014) pkgList
##  "foreach" "codetools" "iterators"
Next, create a repository with the function
In this example, get the required files for
as well as windows binaries:
# Create temporary folder for miniCRAN dir.create(pth <- file.path(tempdir(), "miniCRAN")) # Make repo for source and win.binary makeRepo(pkgList, path = pth, repos = revolution, type = c("source", "win.binary"))
Investigate the repository file structure:
# List all files in miniCRAN list.files(pth, recursive = TRUE, full.names = FALSE)
pkgAvail to list available packages in your
# Check for available packages pkgAvail(repos = pth, type = "win.binary")[, c(1:3, 5)]
To install packages from a local repository, you need to use the Uniform
Resource Identifier (URI) convention
file:/// to point
to your file location.
install.packages(pkgs, repos = paste0("file:///", pth), type = "source")
After creating a local miniCRAN repository, additional packages and their dependencies can easily be added. This mechanism can also be used to re-add an existing package to the miniCRAN repo.
# Add new packages (from CRAN) to the miniCRAN repo addPackage("Matrix", path = pth, repos = revolution, type = c("source", "win.binary")) pkgAvail(repos = pth, type = "win.binary")[, c(1:3, 5)]
The value that is returned (invisibly) via
the number of packages written to the index file, i.e., the
total number of packages in the repo of that type.
To add a specific version of a package from CRAN (or another CRAN-like repository), we can easily download the source packages from the CRAN archives. Dependencies for old package versions cannot be determined automatically and must be specified by the user.
Note: in order to to add binaries of older packages, you will need to download the source and build the binaries on the intended platform yourself. You will need the appropriate R development tools installed in order to build package binaries from source.
# create a data frame with the package and version info <- data.frame( oldVers package = c("foreach", "codetools", "iterators"), version = c("1.4.0", "0.2-7", "1.0.5"), stringsAsFactors = FALSE ) # download old source package version and create repo index addOldPackage(pkgList, path = pth, vers = oldVers$version, repos = revolution, type = "source")
You will get a warning whenever there are multiple versions of a package saved in the repository. Currently, you need to manually remove duplicate versions before rebuilding the repository’s package index.
Note: This last step is important, otherwise you may end up with a repo in an inconsistent state.
# List package versions in the miniCRAN repo (produces warning about duplicates) <- checkVersions(pkgList, path = pth, type = "source") pkgVersionsSrc <- checkVersions(pkgList, path = pth, type = "win.binary") pkgVersionsBin # After inspecting package versions, remove old versions basename(pkgVersionsSrc) # duplicate versions basename(pkgVersionsBin) file.remove(pkgVersionsSrc[c(2,4,6)]) # rebuild the package index after removing duplicate package versions updateRepoIndex(pth, type = c("source", "win.binary"))
To see the updated list of packages available in the miniCRAN repo:
pkgAvail(pth, type = "source")[, c(1:3, 5)] # contains the old versions pkgAvail(pth, type = "win.binary")[, c(1:3, 5)] # contains the current versions
This feature will be implemented in a future release.
Checking for updated versions of the packages currently stored in the miniCRAN repository:
# Check if updated packages are available oldPackages(path = pth, repos = revolution, type = "source")[, 1:3] # should need update oldPackages(path = pth, repos = revolution, type = "win.binary")[, 1:3] # should be current
Update the versions of the packages currently stored in the miniCRAN
repository. By default, a prompt is given to confirm the update for each
package. This prompt can be suppressed using
ask = FALSE,
which will update all packages. Be careful using this option if you want
to keep certain packages at an older version.
# Update available packages updatePackages(path = pth, repos = revolution, type = "source", ask = FALSE) # should need update updatePackages(path = pth, repos = revolution, type = "win.binary", ask = FALSE) # should be current