【问题标题】:Rscript: There is no package called ...?Rscript:没有包叫...?
【发布时间】:2015-02-24 16:51:48
【问题描述】:

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

编辑:

我在script.r所在目录的windows命令行中通过Rscript 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"    

  

【问题讨论】:

  • @flodel - 按要求
  • 好的...现在从.libPaths()重新开始...您也可以在library(timeSeries)之前在script.r中添加print(.libPaths())
  • 好的,太好了!所以现在我们知道了这个问题。 Rscript 库路径未连接到包的实际安装位​​置(请参阅编辑),但 RStudio 和其他是。
  • 所以您的快速解决方法是在调用library(timeSeries) 之前在某处添加.libPaths(c("C:/Users/Patrick/Documents/R/win-library/3.1", .libPaths()))。我不确定为什么 .libPaths() 首先会有所不同。如果您可以使用?.libPaths 的信息找出原因以及更持久的解决方案,那就太好了。
  • 是的,它有效!您想将其发布为答案吗?根据文档,永久解决方案是在环境变量R_LIBS 中设置路径。我不确定为什么路径与 RScript 而不是另一个不同。也许这是为了减少启动时间,因为相比之下 RScript 通常不会在启动时加载那么多东西。

标签: r packages rscript


【解决方案1】:

总之,R.exe中调用Sys.getenv('R_LIBS_USER')返回的值需要和命令行调用this返回的值一致:

Rscript.exe -e "Sys.getenv('R_LIBS_USER')"

并且上面的值需要包含在这个命令行调用中:

Rscript.exe -e ".libPaths()"

请注意如果R_USER 的值在.Rprofilein target field of user's shortcut to R.exe 中更改,则R.exe 和Rscript.exe 之间的R_LIBS_USER 值可能不同,而且总的来说,我发现用户库(即.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)
}
# =====================================================================

【讨论】:

    【解决方案2】:

    如 cmets 中所述,Rscript 似乎无法自动识别库路径默认值。我正在编写一个需要在不同人的计算机上从命令行获取源代码的 R 脚本,所以我想出了这个更通用的解决方法:

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

      library.path <- .libPaths()
      library("timeseries", lib.loc = library.path)
      

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

    【讨论】:

    • 有一个边缘情况需要记住,上面的方法不起作用:stackoverflow.com/questions/28312901/…
    • 嗯,你为什么在library.path &lt;- cat(.libPaths()) 行中使用cat?在我的系统上,cat.libPaths() 的值打印到标准输出(即控制台)并返回NULL,这意味着library.path 被分配了NULL,这不是我认为你想要的。换句话说,你为什么不干脆做library.path = .libPaths()
    • @HaroldFinch 你是对的!我相应地编辑了我的答案。我很肯定这在我发布时有效,对需要为格式添加它有一些模糊的记忆,但我回到它所在的脚本,你完全正确,我也得到了 NULL。谢谢!
    【解决方案3】:

    这个答案不会帮助最初的提问者 (pbreach),但它可能会帮助其他偶然发现这个问题并与我有类似问题的人。

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

    直到昨天,我终于将我的 RRevolution R 8.0.1 beta 升级到 Microsoft R Open 3.4.1 之前一切正常。升级后,每个调用 RScript 的 bash 脚本都失败,原因与此处询问的完全相同(例如 Error in library(zoo) : there is no package called 'zoo')。

    调查显示,如果从 DOS shell 而不是从 cygwin bash shell 调用,RScript 实际上工作正常。

    例如,如果我在 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“个人”目录。

    我的 Windows 配置没有定义 R_USERHOME 环境变量。因此,在DOS shell 的情况下,R 使用我的 Windows“个人”目录 (C:/Users/HaroldFinch/Documents)。这很好,因为这是我所有库的安装位置 (C:/Users/HaroldFinch/Documents/R/win-library/3.4)。

    相比之下,cygwin 定义并导出了一个指向我的cygwin 用户目录的HOME 环境变量,该目录缺少任何R 内容。因此,从cygwin 调用的RScript 有一个错误的R 主目录,因此无法加载库。

    可能有很多方法可以解决这个问题。我决定让我的 bash 脚本设置一个指向我的 Windows 用户目录的 R_USER 环境变量。

    例如,如果我在 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 示例完全相同。

    【讨论】:

    • 出色的工作,芬奇先生。根喜欢这个。它节省了几个小时。
    【解决方案4】:

    另一个原因是packrat。如果您使用 packrat 运行,RStudio 会在您打开项目时为您打开它。 RScript 没有,因此您需要在脚本的早期(在库调用之前)使用packrat::on()

    【讨论】:

    • 但是 packrat 位于不易访问的库文件夹中(win-library)
    【解决方案5】:

    正如其他人已经指出的那样,问题是 Rscript.exe 无法识别 win-library 文件夹。对我来说最简单的解决方案是通过添加显式设置库文件夹的路径:

    .libPaths("C:/Users/Benutzer1/Documents/R/win-library/4.0")
    

    到我的程序。然后它会从 win-library 文件夹中加载所有包,它仍然能够从标准库文件夹中加载包。

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2021-02-22
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多