Search code examples
rrstudior-faqlibrary-path

Change R default library path using .libPaths in Rprofile.site fails to work


I am running R on Windows, not as an administrator. When I install a package, the following command doesn't work:

> install.packages("zoo")
Installing package(s) into ‘C:/Program Files/R/R-2.15.2/library’
(as ‘lib’ is unspecified)
Warning in install.packages :
  'lib = "C:/Program Files/R/R-2.15.2/library"' is not writable

To install a package, I have to specify a library location:

install.packages("zoo", lib="C:/software/Rpackages")

To load a package, I also have to specify the library location:

library("zoo", lib.loc="C:/software/Rpackages")

All of this is OK, but I wanted to see if I could add C:/software/Rpackages to the library path somehow and thus not have to type it each time.

As I searched online, I found that one way to do this is to edit the Rprofile.site file and to add the line

.libPaths("C:/software/Rpackages")

However, after doing this, and starting RStudio, this is the output that I get

> .libPaths()
[1] "C:/Program Files/R/R-2.15.2/library" "C:/Program Files/RStudio/R/library" 

The .libPaths command that I added to the Rprofile.site doesn't seem to have had any effect! Why is this the case? Or more importantly, how can I fix the problem so that I can install and load packages without typing in the library location?

Note: if I start RStudio the .libPaths() command seems to work as it is supposed to

.libPaths("C:/software/Rpackages")
> .libPaths()
[1] "C:/software/Rpackages"               "C:/Program Files/R/R-2.15.2/library"

Isn't that strange?


Solution

  • I generally try to keep all of my packages in one library, but if you want to add a library why not append the new library (which must already exist in your filesystem) to the existing library path?

    .libPaths( c( .libPaths(), "~/userLibrary") )
     # obviously this would need to be a valid file directory in your OS
     # min just happened to be on a Mac that day
    

    Or (and this will make the userLibrary the first place to put new packages):

    .libPaths( c( "~/userLibrary" , .libPaths() ) )
    

    Then I get (at least back when I wrote this originally):

    > .libPaths()
    [1] "/Library/Frameworks/R.framework/Versions/2.15/Resources/library"
    [2] "/Users/user_name/userLibrary"  
    

    The .libPaths function is a bit different than most other nongraphics functions. It works via side-effect. The functions Sys.getenv and Sys.setenv that report and alter the R environment variables have been split apart but .libPaths can either report or alter its target.

    The information about the R startup process can be read at ?Startup help page and there is RStudio material at: https://support.rstudio.com/hc/en-us/articles/200549016-Customizing-RStudio

    In your case it appears that RStudio is not respecting the Rprofile.site settings or perhaps is overriding them by reading an .Rprofile setting from one of the RStudio defaults. It should also be mentioned that the result from this operation also appends the contents of calls to .Library and .Library.site, which is further reason why an RStudio- (or any other IDE or network installed-) hosted R might exhibit different behavior.

    Since Sys.getenv() returns the current system environment for the R process, you can see the library and other paths with:

    Sys.getenv()[ grep("LIB|PATH", names(Sys.getenv())) ]
    

    The two that matter for storing and accessing packages are (now different on a Linux box):

    R_LIBS_SITE                          /usr/local/lib/R/site-library:/usr/lib/R/site-library:/usr/lib/R/library
    R_LIBS_USER                          /home/david/R/x86_64-pc-linux-gnu-library/3.5.1/