【问题标题】:r update.packages() not updating packages that are imported by other packagesr update.packages() 不更新由其他包导入的包
【发布时间】:2019-01-31 05:58:57
【问题描述】:

我最近从 3.4.3 更新到 R 3.5.1。我更新了我的包如下:

(a) 将旧库中的包复制到新库中(注意不要覆盖基础包)

(b) 跑了update.packages(ask = FALSE, dependencies = TRUE)

我发现许多包没有安装在它们被列为其他包的导入的地方,因为它们“是用具有不同内部结构的 r 版本创建的,需要重新安装”。

有点令人沮丧的是,这条消息似乎在遍历一些隐藏的关联或链接包列表,但一次只告诉我一个包有问题;即我会安装版本错误的软件包,然后尝试重新安装它阻止安装的软件包,只是为了让不同的软件包重复错误。我不得不经历多次,直到没有更多与错误版本相关的包,最后我需要使用的包可以安装/更新。

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

我从这一切中得出结论,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

查看DescToolshere 的CRAN 条目表明包expm 不是依赖项,而是已导入。

但是?import.packages 谈到dependencies 参数:

依赖:

逻辑指示是否也安装卸载 这些包所依赖的包/链接到/导入/建议(等等 递归)。如果 repos = NULL,则不使用。也可以是人物 向量,c("Depends", "Imports", "LinkingTo", "Suggests", “增强”)。

仅当 lib 长度为 1(或缺失)时才支持,所以它是 明确安装依赖包的位置。如果这不是 忽略它的情况,并带有警告。

默认值 NA 表示 c("Depends", "Imports", "LinkingTo")。真的 表示对 pkgs 使用 c("Depends", "Imports", "LinkingTo", "Suggests") 和 c("Depends", "Imports", "LinkingTo") 添加依赖项:this 安装运行 pkgs 所需的所有软件包,它们的示例,测试 和小插图(如果包作者正确指定了它们)。

在所有这些中,二进制包都省略了“LinkingTo”。

这意味着update.packages(...dependencies = TRUE)应该也更新和/或安装了所有由其他包导入的包。

我错过了什么?

【问题讨论】:

  • 你试过update.packages(ask=FALSE, checkBuilt=TRUE) 吗?
  • 啊 - 新的我可能忘记了一些东西 - 没有包括 checkBuilt = TRUE,这就是为什么有些包是从源代码构建的吗?
  • 不知道(二进制与源似乎是一个正交/不相关的问题?)

标签: r import package updates


【解决方案1】:

看起来 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/修改)

【讨论】:

  • 在我的情况下,虽然我所有的包都在一个库中?
  • 另外我希望缩短这个过程,如果我最近更新了一些包(即有最新版本),我就不需要再这样做了(而我想 install.packages 会重新安装所有东西) ?
【解决方案2】:

更新到 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() 中的第一个目录在用户级别是可写的,其他三个是只读的。该代码遍历只读文件夹中的所有包,并将其较新版本安装在用户可写目录中。从某种意义上说,它可能会多次迭代某些包,这并不是最佳选择,但您只需要运行一次,然后所有包都安装完毕,而不会出现令人讨厌的“不同内部结构”错误。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2019-02-26
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2021-03-24
    • 2016-01-15
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多