这种方法很粗糙(尤其是它会多次愉快地重新下载一个软件包),但这是目前为止我想到的最好的办法:
install.rec = function(pkg, repos = 'http://archive.linux.duke.edu/cran')
{while (T)
{message("INSTALLING: ", pkg)
out = paste0(collapse = " ",
system2("Rscript", stdout = T, stderr = T, sprintf(
"--no-init-file -e \"install.packages('%s', repos='%s')\"",
pkg, repos)))
p = regmatches(out, regexec(text = out, perl = T,
"package ‘(\\S+)’ was installed (?:before R|by an R version)"))[[1]]
if (length(p))
{p = p[2]
message("START RECURSING: ", pkg, " - ", p)
install.rec(p, repos)
message("END RECURSING: ", pkg, " - ", p)}
else
break}
message("DONE WITH: ", pkg)}
install.packages
不会引发条件,也不会返回错误,也不会以可捕获的方式产生其输出,因此我们必须使用系统调用来查看错误消息。这个想法来自于这里。
install.packages()
的“隐含契约”是它可以假定你的_已安装的包是最新的_。你应该运行update.packages()
,它会处理这部分内容。通过保持与_CRAN版本的已安装包_同步,您几乎可以确保要安装的软件包将与它们一起正常工作。(由于缺少系统库或其他install.packages()
无法控制的工具,安装仍可能失败。) - Dirk Eddelbuettelupdate.packages
(就是您所指的吗?)会升级每个已安装的软件包,这应该足够了,但有些过头。 - Kodiologistupdate.packages()
,它只会更新一小部分包(使用Ncpus
选项并行更新)。我认为你陷入了一个心理障碍,想要既有完全稳定性又没有变化,同时又能完美地安装任何其他包。但这不是CRAN给你的服务保证,所以你必须做些其他的事情:这是一个方块求圆的问题。你的情况可能有所不同。 - Dirk Eddelbuettelinstall.packages()
会对你的新包做些什么。它们将全部都是CRAN上的最新版本。 - Dirk Eddelbuettel