Recently, while working on the Azure Data Lake R extension, I had to figure out a good way to create a zip file containing a package together with all its dependencies. This came down to understanding where does R store and search for packages. Despite the documentation, it did require additional reading and experimentation.
First, the accompanying video:
Before getting into package search paths, let’s first figure out how does an R package look in the file system:
An R package is a folder somewhere in the file system. Above quantmod, TTR, xts and zoo are all folders each containing the corresponding package. For these packages to be found by R, the rsite folder (its absolute path, for instance c:/users/ivannp/rsite) needs to be added to R’s search path.
R’s package search path is reported by the .libPaths() function (invoked without arguments). The result is a vector of strings, each representing a path containing packages. When the user requests a package to be loaded (via require or via library), R searches for the package in each path of the list, starting with the first. If the package is found, it is loaded and the search finishes. Thus, it is important to understand how the vector of paths is build.
The last element of the path is R’s distribution library path. On Windows this could be:
This path cannot be removed. Calling .libPaths(”) (with an empty string) will remove all other entries but the library sub-directory of the distribution.
There are three environment variables which control the content of the path vector:
The content of these environment variables is added to the package search path in the order listed. First R_LIBS, then R_LIBS_USER and finally R_LIBS_SITE.
If none of the three environment variables is defined, R will append a default path to the search list. This path is platform dependent. On Windows it is something like:
To avoid depending on this behavior, I typically have R_LIBS_USER set. On Windows, make sure that the path doesn’t end with slash (‘/’ or ‘\’). According to .libPaths() documentation, paths ending on a slash are invalid, and R silently ignores them.
Will all this knowledge, the solution to the original problem – how to create a zip containing a package together with all its dependencies, is clear:
.libPaths('') # Cleanup any additional paths the user might have dir.create('packages') # Create the directory .libPaths('packages') # To add packages to the R search folders install.packages('ggplot2') # Install all zip('packages.zip', 'packages') # Create the zip
The above script create packages.zip containing ggplot2 and all its dependencies. A local folder packages is used in the process. That’s assuming there are no additional packages in R’s root installation.