Rscript: There is no package called ...?
In short, the value returned by calling Sys.getenv('R_LIBS_USER')
in R.exe needs to be the same as the value returned by calling this at the command line:
Rscript.exe -e "Sys.getenv('R_LIBS_USER')"
and the above value needs to be included in this command line call:
Rscript.exe -e ".libPaths()"
Note that the values of R_LIBS_USER
may be differ between R.exe and Rscript.exe if the value of R_USER
is changed, either in the .Rprofile
or the in target field of user's shortcut to R.exe
, and in general, I find that the user library (i.e. .libPaths()[2]
) is simply not set in Rscript.exe
Since I'm fond of setting R_USER
to my USERPROFILE
, I include the following block in at the top of .R
files that I wish to run on mulitiple computers or in Rscript.exe's .Rprofile
(i.e. Rscript -e "path.expand('~/.Rprofile')"
):
# =====================================================================
# For compatibility with Rscript.exe:
# =====================================================================
if(length(.libPaths()) == 1){
# We're in Rscript.exe
possible_lib_paths <- file.path(Sys.getenv(c('USERPROFILE','R_USER')),
"R","win-library",
paste(R.version$major,
substr(R.version$minor,1,1),
sep='.'))
indx <- which(file.exists(possible_lib_paths))
if(length(indx)){
.libPaths(possible_lib_paths[indx[1]])
}
# CLEAN UP
rm(indx,possible_lib_paths)
}
# =====================================================================
As mentioned in the comments, it seems Rscript doesn't recognize the library path defaults automatically. I am writing an R script that needs to be source-able from the command line on different people's computers, so I came up with this more general workaround:
- First store the default library path in a variable (Rscript-sourced functions can find this, they just don't automatiocally)
- Then include that path in the
library()
call withlib.loc =
argument. This should work regardless of what the path is on a given computer.
library.path <- .libPaths() library("timeseries", lib.loc = library.path)
Thanks again to @flodel above for putting me on the right path
This answer will not help the original asker (pbreach), but it may help someone else who stumbles across this question and has a similar problem to me.
I have many bash
.sh
script files which call RScript
to execute .R
files. My operating system is Windows 10
, and I execute those bash
files using cygwin
.
Everything had been working fine until yesterday, when I finally upgraded my R
from Revolution R 8.0.1 beta
to Microsoft R Open 3.4.1
. After that upgrade, every bash script that called RScript
failed due to the exact same reason asked here (e.g. Error in library(zoo) : there is no package called 'zoo'
).
Investigation revealed that RScript
actually worked fine if called from a DOS shell
instead of from a cygwin bash shell.
For example, if I execute this in a DOS shell
C:\Progra~1\Microsoft\ROpen~1\R-3.4.1\bin\x64\Rscript.exe -e ".libPaths()"
I see the output
[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"
I eventually discovered the reason. As explained in the R FAQ, to define its home directory, R
will first use the R_USER
environment variable if defined, else it will use HOME
environment variable if defined, else it will use the Windows "personal" directory.
My Windows configuration does not define either R_USER
or HOME
environment variables. So, in the DOS shell
case, R
uses my Windows "personal" directory (C:/Users/HaroldFinch/Documents
). That is good, because that is where all my libraries are installed (C:/Users/HaroldFinch/Documents/R/win-library/3.4
).
In contrast, cygwin
defines and exports a HOME
environment variable that points to my cygwin
user directory, which lacks any R
stuff. Hence, RScript
called from cygwin
had a wrong R
home directory, and so failed to load libraries.
There are probably many ways to solve this. I decided to have my bash script set a R_USER
environment variable which points to my Windows user directory.
For example, if I execute this in a cygwin bash shell
:
R_USER="C:/Users/HaroldFinch/Documents"
export R_USER
/cygdrive/c/Progra~1/Microsoft/ROpen~1/R-3.4.1/bin/x64/Rscript.exe -e ".libPaths()"
I see the output
[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"
which is exactly the same output now as the DOS shell example above.