Rscript:没有名为......的包?

时间:2014-12-28 01:30:25

标签: r packages rscript

我想使用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"    

5 个答案:

答案 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脚本,需要在不同人的计算机上从命令行获取源代码,所以我提出了这个更通用的解决方法:

  • 首先将默认库路径存储在变量中(Rscript-sourced functions 可以找到它,它们只是不自动)
  • 然后使用lib.loc =参数在library.path <- .libPaths() library("timeseries", lib.loc = library.path) 调用中包含该路径。
  • 无论给定计算机上的路径是什么,这都应该有效。

    {{1}}

再次感谢上面的@flodel让我走上了正确的道路

答案 2 :(得分:2)

这个答案不会对原来的提问者(pbreach)有所帮助,但它可能会帮助那些偶然发现这个问题并且对我有类似问题的人。

我有许多bash .sh个脚本文件,它们调用RScript来执行.R个文件。我的操作系统为Windows 10,我使用bash执行这些cygwin个文件。

直到昨天,当我最终将RRevolution 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_USERHOME个环境变量。因此,在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 文件夹加载所有包,它仍然能够从标准库文件夹加载包。