重新安装GNU R中的所有包

时间:2017-02-06 21:43:24

标签: r cran

有时候,你在GNU R遇到一个问题,Hadley Wickham recommends

  

我建议您重新安装所有套餐。

问题是如何以最好的方式做到这一点。我知道install.packages将overwrite existing versions

当只使用CRAN软件包时(GitHub或其他来源没什么特别的),这种天真的方法对我有用:

my.packages <- rownames(installed.packages());
install.packages(my.packages);

但是,如果我有installed dev versions from GitHub,或者使用了一些未公开共享的本地软件包,我该怎么办?

我正在寻找的方法是:

  1. 检查新安装(升级/降级)对软件包的更改

  2. 从同一来源再次安装包

  3. 备份我的旧包文件夹

  4. 是否有可以满足这些要求的脚本?

2 个答案:

答案 0 :(得分:1)

((1)的部分解决方案 - 找出将升级/降级的软件包)

my.packages <- installed.packages();
my.avail <- available.packages();

z <- merge(
      my.packages[,c("Package","Version")],
      my.avail[,c("Package","Version")],
      by = "Package", suffixes = c('.my','.avail'));

z$Version.my <- as.character(z$Version.my)
z$Version.avail <- as.character(z$Version.avail)

# my packages which will be upgraded
subset(z, Version.my < Version.avail)

# my packages that will be downgraded
subset(z, Version.my > Version.avail)

这只是近似值,我认为 - 根据依赖关系,您可能无法获得所有升级。但是如果使用开发版本,你会看到降级的预期吗?

答案 1 :(得分:1)

您可以尝试以下方法。

libLoc<-.libPaths()[1]
update.packages(lib.loc = libLoc, instlib = libLoc, checkBuilt = TRUE, ask = FALSE)

这里lib.loc是您要更新的现有软件包的位置,而instlib是新软件包的位置(与上面的示例片段相同)。如果要更新所有现有软件包(不仅限于lib.loc中的软件包,而是将所有新的更新软件包放在NULL位置,请避免传递libLoc或将其设置为instlib 。请查看update.packages函数的文档以获取更多信息。

我在遇到软件包问题时使用了此功能,并且在权限有限的远程系统上从较早版本升级到R-3.5后不得不重新安装它们。

希望这会有所帮助。