我在 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... 我错过了什么吗?有没有我在某处没有看到的错误?还是集群设置的问题?
虽然这是对这个问题的较晚答复,但当我尝试在 Web 应用程序中执行 R 脚本时,我遇到了同样的问题。我收到了相同的错误消息,但对于不同的库,如下所示。
Error : Error in library("partitions") : there is no package called 'partitions'
导致此问题的原因可能有多种。我会尽力解决我遇到的问题。
执行批处理脚本的用户没有访问 R 库的权限。 R 库主要位于两个目录中,可以通过执行
.libPaths()
命令列出这两个目录。在 Windows 中,位置可能如下。确保执行脚本的用户(可能是您的服务器或其他用户)有权访问库位置。
虽然脚本执行器具有库位置的权限,但用户可能无法看到库位置。因此,您可以通过执行以下命令来指定每个库的库位置
library("your_lib_name",lib.loc="/path/to/R-packages/")
或者,您可以通过在脚本顶部添加以下行来指定第二个库位置。这将添加用户无法看到的任何路径。
.libPaths( c( .libPaths(), "/path/to/R-packages") )
就我而言,我可以通过在脚本顶部添加以下逻辑来即时安装缺少的软件包。它将把 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))