r update.packages()不更新其他软件包导入的软件包

时间:2018-08-24 18:12:46

标签: r import package updates

我最近从3.4.3更新到R 3.5.1。我更新了软件包,如下所示:

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

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

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

有些令人沮丧的是,此消息似乎遍历了一些隐藏的关联或链接软件包列表,但只告诉我一次存在一个软件包问题;也就是说,我将安装版本错误的软件包,然后尝试重新安装已阻止安装的软件包,只是让另一个软件包重复出现该错误。我不得不经历多次,直到不再有与错误版本相关的软件包,最后我需要使用的软件包才能被安装/更新。

也-我注意到一些软件包是从源代码安装的(这些软件包经常但并非唯一地导致上述关联软件包的“内部差异”错误)。我确实已经安装了Rtools,所以这对我来说不是问题,而只是作为update.A的观察。每次遇到比Windows二进制文件(我有Windows 10 PC)更新的源代码时,packages都会这样做。 >

从这一切中我得出结论,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 here的CRAN条目表明软件包expm不是依赖项,而是已导入。

但是?import.packages说了dependencies参数:

  

依赖项:

     

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

     

仅当lib的长度为一(或缺少)时才受支持,因此   明确在哪里安装相关软件包。如果不是这样   在被警告的情况下会被忽略。

     

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

     

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

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

我想念什么?

2 个答案:

答案 0 :(得分:1)

看起来Dependencies = TRUE不是update.packages的参数,而是将其传递给install.packages

文档

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

在将依赖项(传递给install.packages)与update.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/修改而来的)

答案 1 :(得分:1)

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