我想使用Rscript以批处理模式运行R文件,但它似乎没有加载我需要的库。我得到的具体错误是:
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted
但是我有包timeSeries
并且可以从命令行从Rstudio,RGui和R加载它没问题。问题似乎只是在使用Rscript运行脚本时。
我的系统/环境变量配置为:
C:\Program Files\R\R-3.1.0\bin\x64 (Appended to PATH)
R_HOME = C:\Program Files\R\R-3.1.0
R_User = Patrick
我从命令行在RStudio,RGui和R中运行相同版本的R.我还从这三个来源检查了.Library
并获得了相同的输出。
如何在命令行中使用我在R中使用(并已安装)的软件包运行Rscript?
我在Rscript script.r
所在目录的Windows命令行中通过script.r
使用Rscript。
Rscript -e print(.Library)
的输出为[1] "C:/PROGRA~1/R/R-31~1.0/library"
与我提到的其他三个选项一致:[1] "C:/PROGRA~1/R/R-31~1.0/library"
但是,如果我把它放在我的脚本中:
print(.libPaths())
library(timeSeries) #This is the package that failed to load
我得到了输出:
[1] "C:/Program Files/R/R-3.1.0/library"
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted
RStudio中的相应调用提供了实际安装包的其他路径:
> print(.libPaths())
[1] "C:/Users/Patrick/Documents/R/win-library/3.1" "C:/Program Files/R/R-3.1.0/library"
答案 0 :(得分:7)
简而言之,在R.exe中调用Sys.getenv('R_LIBS_USER')
返回的值需要与在命令行调用它返回的值相同:
Rscript.exe -e "Sys.getenv('R_LIBS_USER')"
和上述值需要包含在此命令行调用中:
Rscript.exe -e ".libPaths()"
请注意如果R_LIBS_USER
的值发生更改,则R_USER
的值可能会因R {0}和Rscript.exe而有所不同.Rprofile
}或in target field of user's shortcut to R.exe
,一般来说,我发现用户库(即.libPaths()[2]
)根本没有在Rscript.exe中设置
由于我喜欢将R_USER
设置为我的USERPROFILE
,因此我将以下块放在我希望在多台计算机上运行的.R
文件的顶部或在Rscript.exe' .Rprofile
中(即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)
}
# =====================================================================
答案 1 :(得分:6)
正如评论中所提到的,似乎Rscript没有自动识别库路径默认值。我正在编写一个R脚本,需要在不同人的计算机上从命令行获取源代码,所以我提出了这个更通用的解决方法:
lib.loc =
参数在library.path <- .libPaths()
library("timeseries", lib.loc = library.path)
调用中包含该路径。无论给定计算机上的路径是什么,这都应该有效。
{{1}}
再次感谢上面的@flodel让我走上了正确的道路
答案 2 :(得分:2)
这个答案不会对原来的提问者(pbreach)有所帮助,但它可能会帮助那些偶然发现这个问题并且对我有类似问题的人。
我有许多bash
.sh
个脚本文件,它们调用RScript
来执行.R
个文件。我的操作系统为Windows 10
,我使用bash
执行这些cygwin
个文件。
直到昨天,当我最终将R
从Revolution R 8.0.1 beta
升级到Microsoft R Open 3.4.1
时,一切都运转良好。升级之后,每个调用RScript
的bash脚本都会因为此处提出的完全相同的原因(例如Error in library(zoo) : there is no package called 'zoo'
)失败。
调查显示RScript
实际上工作正常,如果从DOS shell
调用而不是从cygwin bash shell调用。
例如,如果我在DOS shell
C:\Progra~1\Microsoft\ROpen~1\R-3.4.1\bin\x64\Rscript.exe -e ".libPaths()"
我看到输出
[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"
我最终发现了原因。 As explained in the R FAQ,要定义其主目录,R
将首先使用R_USER
环境变量(如果已定义),否则它将使用HOME
环境变量(如果已定义),否则它将使用Windows&#34;个人&#34; 。目录
我的Windows配置未定义R_USER
或HOME
个环境变量。因此,在DOS shell
案例中,R
使用我的Windows&#34;个人&#34;目录(C:/Users/HaroldFinch/Documents
)。这很好,因为这是我所有库的安装位置(C:/Users/HaroldFinch/Documents/R/win-library/3.4
)。
相反,cygwin
定义并导出一个HOME
环境变量,该变量指向我的cygwin
用户目录,该目录缺少任何R
内容。因此,从RScript
调用的cygwin
有一个错误的R
主目录,因此无法加载库。
可能有很多方法可以解决这个问题。我决定让我的bash脚本设置一个R_USER
环境变量,该变量指向我的Windows用户目录。
例如,如果我在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()"
我看到输出
[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"
这与上面的DOS shell示例完全相同。
答案 3 :(得分:0)
另一个原因是packrat。如果您使用packrat运行,则RStudio在打开项目时会为您打开它。 RScript不需要,因此您需要在脚本的开头(在库调用之前)先使用packrat::on()
。
答案 4 :(得分:0)
正如其他人已经指出的,问题是 Rscript.exe 无法识别 win-library 文件夹。对我来说最简单的解决方案是通过添加显式设置库文件夹的路径:
.libPaths("C:/Users/Benutzer1/Documents/R/win-library/4.0")
到我的程序。然后它从 win-library 文件夹加载所有包,它仍然能够从标准库文件夹加载包。