r update.packages()无法更新被其他包导入的包

3

我最近从3.4.3更新到了R 3.5.1。我按以下方式更新我的软件包:

(a) 将旧库中的软件包复制到新库中(小心不要覆盖基础软件包)

(b) 运行 update.packages(ask = FALSE, dependencies = TRUE)

我发现一些软件包在其他软件包中被列为导入项时没有安装成功,因为它们“是使用具有不同内部版本的r创建的,需要重新安装”。

比较令人沮丧的是,这个消息似乎正在遍历某个隐藏的相关或链接的软件包列表,但只告诉我每次只有一个软件包存在问题;也就是说,我将安装错误版本的软件包,然后尝试重新安装它阻止的软件包,只会为另一个软件包重复出现错误。我必须多次重复这个过程,直到没有更多的不正确版本的相关软件包,最终我需要使用的软件包才能被安装/更新。

此外-我注意到某些软件包是从源代码安装的(这些软件包经常但不完全是导致上述关联软件包“不同内部”的错误)。我安装了Rtools,所以对我来说不是问题,但这只是一个观察结果,因为每次update.packages遇到比Windows二进制文件更高版本的源代码时都会这样做(我有一台Windows 10个人电脑)。

我从所有这些中得出结论:由于某种原因,update.packages跳过了许多软件包,并实际上没有更新它们? 我仍然发现一些未更新的软件包。

例如:

> DescTools::Gmean(x)
Error: package ‘expm’ was installed by an R version with different internals; it needs to be reinstalled for use with this R version

查看DescTools的CRAN条目这里表明,包expm不是一个依赖项,但会被导入。
然而,?import.packagesdependencies参数进行了解释:
逻辑值,指示是否安装未安装的与这些软件包有关/链接/导入/建议(等等)的软件包(并以此类推)。如果repos = NULL,则不使用。也可以是字符向量,c("Depends", "Imports", "LinkingTo", "Suggests", "Enhances")的子集。
仅在lib长度为一(或缺失)的情况下受支持,因此可以明确安装相关软件包的位置。如果不是这种情况,则忽略它,并发出警告。
默认值NA表示c("Depends", "Imports", "LinkingTo")。TRUE的意思是对于pkgs使用c("Depends", "Imports", "LinkingTo", "Suggests"),对于添加的依赖项使用c("Depends", "Imports", "LinkingTo"):这将安装运行pkgs所需的所有软件包、它们的示例、测试和vignettes(如果软件包作者正确指定了它们)。
在所有这些中,“LinkingTo”被省略了二进制软件包。
这意味着update.packages(...dependencies = TRUE)应该同时更新和/或安装其他软件包导入的所有软件包。
我错过了什么?

1
你尝试过 update.packages(ask=FALSE, checkBuilt=TRUE) 吗? - Ben Bolker
啊 - 新的我可能忘记了什么 - 没有包括 checkBuilt = TRUE,这可能是为什么一些软件包正在从源代码构建的原因吗? - Amy M
不知道(二进制与源代码似乎是正交/无关的问题?) - Ben Bolker
2个回答

4

我在更新到R 3.6.0版本后遇到了同样的问题。在我的情况下,对Carlos Santillan的解决方案进行了微小的修改,问题得以解决:

for (i in 2:length(.libPaths())) {
  lib <- .libPaths()[i]
  install.packages( 
    lib  = .libPaths()[1] ,
    pkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
    type = 'source'
  )
}

在我的设置中,.libPaths() 返回以下内容:

> .libPaths()
[1] "/home/wassermann/R/x86_64-pc-linux-gnu-library/3.6" "/usr/local/lib/R/site-library"                
[3] "/usr/lib/R/site-library"                            "/usr/lib/R/library"    

.libPaths()中的第一个目录可在用户级别下进行写操作,其他三个目录只能进行读取操作。该代码会遍历所有位于只读文件夹中的软件包,并将其更新版本安装到用户可写的目录中。它并不是最优化的,因为它可能会重复遍历一些软件包,但您只需要运行一次,之后所有软件包都可以安装而不会出现烦人的“不同内部结构”错误。


2
看起来 dependencies = TRUE 不是 update.packages 的参数,而是将它作为参数传递给 install.packages。
文档说明。

https://www.rdocumentation.org/packages/utils/versions/3.5.1/topics/update.packages

说:
在使用update.packages时,使用依赖项(传递给install.packages)时要小心,因为不清楚新的依赖项应该安装在哪里。当前的实现只有当所有要更新的软件包都在单个库中且该库将被使用时才允许它。
以下脚本将重新安装所有软件包。
lib <- .libPaths()[1]
install.packages( 
    lib  = lib ,
    pkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
    type = 'source'
)

以下内容将会检查更新所有包。
lib <- .libPaths()[1]
update.packages( 
 oldPkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
  type = 'source',
  ask = FALSE
)

(以上内容修改自https://www.r-bloggers.com/update-all-user-installed-r-packages-again/

在我的情况下,尽管所有的包都在一个库中? - Amy M
我也希望缩短这个过程,如果我最近更新了一些软件包(即有最新版本),那么我就不需要再次更新(而我猜想install.packages会重新安装所有东西)? - Amy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接