安装R软件包时,需要时自动重新安装依赖项

时间:2019-11-16 16:40:19

标签: r installation dependencies

utils::install.packages似乎完全能够安装缺少的依赖项。但是,如果由于某种原因(例如,在尝试安装DiagrammeRError: package ‘igraph’ was installed by an R version with different internals; it needs to be reinstalled for use with this R version时)已经安装了某个依赖项而没有正确版本的话,原始的install.packages调用就在那里停止。然后,我必须去手动重新安装每个有问题的依赖项。我该如何自动化?

我正在Linux上运行R 3.6.1。

2 个答案:

答案 0 :(得分:0)

似乎没有办法在install.packages()中强制执行此操作。相反,您可以使用pak::pkg_install()。来自pak::pkg_install()“升级”参数:

upgrade 
Whether to upgrade already installed packages to the latest available version. If this is 
FALSE, then only packages that need updates to satisfy version requirements, will be 
updated. If it is TRUE, all specified or dependent packages will be updated to the latest 
available version.

编辑:仔细阅读您的问题,听起来您可能正在使用带有3.5的3.5软件包库。如果是这种情况,我建议在两个版本之间升级时使用R软件包installr。它可以自动重新安装先前版本中的所有软件包。

Edit2:以下代码将向您显示在先前版本上构建的代码。我将为这些软件包运行install.packages(built_on_earlier_version, force = TRUE)

installed_packages <- as.data.frame(installed.packages())

installed_packages[as.package_version(installed_packages$Built) < as.package_version("3.6.0"),]

答案 1 :(得分:0)

这种方法是粗略的(特别是因为它将很高兴多次重新下载软件包),但这是我到目前为止提出的最好的方法:

library(stringr)

install.rec = function(pkg)
   {while (T)
       {message("INSTALLING: ", pkg)
        out = system2("Rscript",
            sprintf(
                "-e \"install.packages('%s', repos='http://probability.ca/cran')\"",
                pkg),
            stdout = T, stderr = T)
        p = str_match(
           paste0(out, collapse = " "),
           "package ‘(\\S+)’ was installed by an R version with different internals")[,2]
        if (!is.na(p))
           {message("START RECURSING: ", pkg, " - ", p)
            install.rec(p)
            message("END RECURSING: ", pkg, " - ", p)}
        else
            break}
   message("DONE WITH: ", pkg)}

install.packages不会引发条件,也不会返回错误,也不会以capture.output可以捕获的方式产生输出,因此我们必须使用系统调用来查看错误消息。这个想法来自here