如果无法安装R软件包,如何使install.packages返回错误?

cbo*_*tig 7 r

install.packages()如果无法安装软件包(例如,如果它不可用),则返回警告; 例如:

install.packages("notapackage")
Run Code Online (Sandbox Code Playgroud)

(编辑:我想抛出一个错误,无论无法安装软件包的原因,不仅仅是这个缺少软件包的示例).

install.packages在脚本中运行命令,我希望它能够触发正确的错误并退出执行.我没有看到内部install.packages处理此行为的明显选项.有什么建议?

Cam*_*err 8

刚刚为自己解决了这个问题后,我注意到 install.packages() 会导致调用 library(thepackage) 以查看它是否可用。

我制作了一个 R 脚本,用于安装给定的包,library在每个包上使用以查看其是否可加载,如果不是,quit则以非 0 状态调用。

我叫它 install_packages_or_die.R

#!/usr/bin/env Rscript

packages = commandArgs(trailingOnly=TRUE)

for (l in packages) {

    install.packages(l, dependencies=TRUE, repos='https://cran.rstudio.com/');

    if ( ! library(l, character.only=TRUE, logical.return=TRUE) ) {
        quit(status=1, save='no')
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Dockerfile 中像这样使用它。我将它们分组为有用的块,以尝试合理使用 Docker 构建缓存。

ADD install_packages_or_die.R /

RUN Rscript --no-save install_packages_or_die.R profvis devtools memoise

RUN Rscript --no-save install_packages_or_die.R memoise nosuchpackage
Run Code Online (Sandbox Code Playgroud)

免责声明:我目前根本不认为自己是 R 程序员,因此很可能有更好的方法来做到这一点。


cbo*_*tig 5

R 函数WithCallingHandlers()让我们可以使用显式定义的函数处理任何警告。例如,我们可以告诉 R 在收到任何警告时停止(并将警告消息作为错误消息返回)。

withCallingHandlers(install.packages("notapackage"),
                    warning = function(w) stop(w))
Run Code Online (Sandbox Code Playgroud)

我猜这并不理想,因为大概一个包可以成功安装但仍然会发出警告;但没遇到过这种情况。正如 Dirk 所建议的那样,require对包的测试可能更健壮。


Dir*_*tel 0

扩展快速评论:

R> AP <- available.packages()
R> "notapackage" %in% AP[,1]      # expected to yield FALSE
[1] FALSE
R> "digest" %in% AP[,1]           # whereas this should be TRUE
[1] TRUE
R> 
Run Code Online (Sandbox Code Playgroud)