升级所有标准包,同时保留非标准包

Upgrade all standard packages while retaining non-standard packages

有时 GNU R 有一个问题,即 Hadley Wickham recommends:

I'd recommend re-installing all your packages.

问题是如何以最好的方式做到这一点。我知道 install.packagesupdate.packages 将升级所有包版本和 overwrite existing versions:

update.packages(checkBuilt = TRUE, ask = FALSE)

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

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

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

我正在寻找的是一种方法:

  1. 检查新安装对包的哪些更改 (upgrades/downgrades);
  2. 从同一来源重新安装软件包;和
  3. 备份我的旧包文件夹。

我该如何满足这些要求?

(1) 的部分解决方案 - 找出哪些包将 upgraded/downgraded:

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)

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

另一种升级所有软件包的方法是使用以下方法:

您可以试试下面的方法

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

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

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

希望对您有所帮助。