gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:57:57 25 4
gpt4 key购买 nike

我最近从 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

查看 DescTools 的 CRAN 条目here表示包裹 expm不是依赖项,而是导入的。

但是?import.packagesdependencies参数:

dependencies:

logical indicating whether to also install uninstalled packages which these packages depend on/link to/import/suggest (and so on recursively). Not used if repos = NULL. Can also be a character vector, a subset of c("Depends", "Imports", "LinkingTo", "Suggests", "Enhances").

Only supported if lib is of length one (or missing), so it is unambiguous where to install the dependent packages. If this is not the case it is ignored, with a warning.

The default, NA, means c("Depends", "Imports", "LinkingTo"). TRUE means to use c("Depends", "Imports", "LinkingTo", "Suggests") for pkgs and c("Depends", "Imports", "LinkingTo") for added dependencies: this installs all the packages needed to run pkgs, their examples, tests and vignettes (if the package author specified them correctly).

In all of these, "LinkingTo" is omitted for binary packages.

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

我错过了什么?

最佳答案

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

关于r update.packages() 不更新由其他包导入的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com