Creating a Shared Library of R Packages
Goal: Demonstrate how to use an R library to create a shared set of R packages.
Use Case
Consider the following use cases:
You’re collaborating on some research and want users of the project to use the same R environment and set/version of a collection of R packages.
You’re leading a workshop and want all attendees to learn using the same environment.
In both cases we can setup an R library within a shared location, such as a project folder, which all users can access, and thus use the same set of packages.
General Process
The general process for this is:
Create a folder in a shared location.
Load and start R.
Update the library paths to point to this location.
Install R packages.
Every time this is to be used:
Load and start R.
Update the library paths to point to this location.
Example
# Create R Library folder:
[]$ cd /project/arcc/software/
[]$ mkdir -p r_library/r_workshop
[]$ cd r_library/r_workshop/
[]$ pwd
/project/<project-name>/software/r_library/r_workshop
# Load and Start R
[]$ module purge
[]$ module load gcc/14.2.0 r/4.4.0
[]$ R
# Check current library paths:
> .libPaths()
[1] "/cluster/medbow/home/<username>/R/x86_64-pc-linux-gnu-library/4.4"
[2] "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library"
Current Available R Packages
> write.table(installed.packages()[,c(1,2,3:4)])
"Package" "LibPath" "Version" "Priority"
"class" "class" "/cluster/medbow/home/<username>/R/x86_64-pc-linux-gnu-library/4.4" "7.3-22" "recommended"
...
"XML" "XML" "/cluster/medbow/home/<username>/R/x86_64-pc-linux-gnu-library/4.4" "3.99-0.17" NA
"base" "base" "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library" "4.4.0" "base"
...
"utils" "utils" "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library" "4.4.0" "base"
Note: We can current see packages installed:
Under our home folder.
Base packages installed as part of this R version.
Update the Library Path
Update the library paths to point to my newly created library folder, and the base packages.
> .libPaths(c('/project/<project-name>/software/r_library/r_workshop', '/apps/u/spack/gcc/12.2.0/r/4.4.0-7i7afpk/rlib/R/library'))
> write.table(installed.packages()[,c(1,2,3:4)])
"Package" "LibPath" "Version" "Priority"
"base" "base" "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library" "4.4.0" "base"
...
"utils" "utils" "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library" "4.4.0" "base"
Note: We can currently only see the base packages since we haven’t yet installed anything into /project/arcc/software/r_library/r_workshop
Install a package into the New Library Location
# Within R:
> install.packages("Matrix")
...
also installing the dependency ‘lattice’
...
* DONE (Matrix)
> write.table(installed.packages()[,c(1,2,3:4)])
"Package" "LibPath" "Version" "Priority"
"lattice" "lattice" "/cluster/medbow/project/<project-name>/software/r_library/r_workshop" "0.22-6" "recommended"
"Matrix" "Matrix" "/cluster/medbow/project/<project-name>/software/r_library/r_workshop" "1.7-0" "recommended"
"base" "base" "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library" "4.4.0" "base"
...
"utils" "utils" "/apps/u/spack/gcc/14.2.0/r/4.4.0-w7xoohc/rlib/R/library" "4.4.0" "base"
# Lets check:
[]$ ls /project/<project-name>/software/r_library/r_workshop
lattice Matrix
Test and Use
Error:
[]$ cat r_library_test_fail.R
library(Matrix)
[]$ Rscript r_library_test_fail.R
Error in library(Matrix) : there is no package called ‘Matrix’
Execution halted
# The Matrix package is NOT available under our default library location.
Success:
Update the .libPaths()
every time you wish to use this R library.
[]$ cat r_library_test.R
.libPaths(c('/project/<project-name>/software/r_library/r_workshop', '/apps/u/spack/gcc/12.2.0/r/4.4.0-7i7afpk/rlib/R/library'))
library(Matrix)
[]$ Rscript r_library_test.R
[]$
Warning: Remember
Within this example, by default this is a SHARED project location.
Anyone who has access to this project and thus this shared library can update it.
If an individual performs an install.packages()
it will effect everyone.
The project users will need to collaborate and come up with some form of data plan and/or process for the management of this shared library.