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