Rscript 找不到库

问题描述 投票:0回答:1

我在 Unix 集群上作为批处理作业运行 R 脚本时遇到问题。问题是当尝试在环境中加载库时,R 找不到该库。我给你举个例子。我将使用基本的 R 脚本名称 sess.R:

print(.libPaths())
library("gtools")

print(sessionInfo())

如果我只是使用以下命令从命令行运行此脚本:

$ Rscript sess.R

我得到以下输出:

[1] "/usr/lib64/R/library" "/usr/share/R/library"
R version 3.2.3 (2015-12-10)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS release 6.6 (Final)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  base

other attached packages:
[1] gtools_3.5.0

库“gtools”已正确加载,脚本正在运行。但是,如果我编写一个简单的批处理作业(我将在作业中包含几个可选参数,包括错误和输出文件),例如:

#!/bin/bash
#SBATCH --output=sess.out
#SBATCH --error=sess.err

Rscript sess.R

作业在一秒钟后失败。我得到的两个输出文件当然是 sess.out 和 sess.err。 Sess.out包含库目录:

[1] "/usr/lib64/R/library" "/usr/share/R/library"

这似乎与从命令行运行 Rscript 时相同,因此没有错误。但是,由于脚本已终止,因此不会打印信息会话。 sess.err 文件包含以下错误:

Error in library("gtools") : there is no package called ‘gtools’
Execution halted

在那里,即使库路径相同,R 在这种情况下似乎也找不到 gtools... 我错过了什么吗?有没有我在某处没有看到的错误?还是集群设置的问题?

r libraries rscript
1个回答
0
投票

虽然这是对这个问题的较晚答复,但当我尝试在 Web 应用程序中执行 R 脚本时,我遇到了同样的问题。我收到了相同的错误消息,但对于不同的库,如下所示。

Error : Error in library("partitions") : there is no package called 'partitions'

导致此问题的原因可能有多种。我会尽力解决我遇到的问题。

  1. 解决方案 1:提供对库文件夹的权限

执行批处理脚本的用户没有访问 R 库的权限。 R 库主要位于两个目录中,可以通过执行

.libPaths()
命令列出这两个目录。在 Windows 中,位置可能如下。确保执行脚本的用户(可能是您的服务器或其他用户)有权访问库位置。

  • C:/Users/%USERNAME%/AppData/Local/R/win-library/4.x
  • C:/Program Files/R/R-4.x.0/library
  1. 解决方案 2:手动指定 R 库位置

虽然脚本执行器具有库位置的权限,但用户可能无法看到库位置。因此,您可以通过执行以下命令来指定每个库的库位置

library("your_lib_name",lib.loc="/path/to/R-packages/")

或者,您可以通过在脚本顶部添加以下行来指定第二个库位置。这将添加用户无法看到的任何路径。

.libPaths( c( .libPaths(), "/path/to/R-packages") )

  1. 解决方案 3:动态安装默认库路径中的库

就我而言,我可以通过在脚本顶部添加以下逻辑来即时安装缺少的软件包。它将把 R 库添加到基本库位置,而不将其安装在用户特定的库路径中。


packages <- c('pkg_1','pkg_2','pkg_3')

# Install packages not yet installed
installed_packages <- packages %in% rownames(installed.packages())
if (any(installed_packages == FALSE)) {
  install.packages(packages[!installed_packages],repos="https://mirrors.cicku.me/cran/")
}

# Packages loading
invisible(lapply(packages, library, require, character.only = TRUE, quietly=TRUE))

© www.soinside.com 2019 - 2024. All rights reserved.