我的系统(服务器)中安装了大约4000个R软件包,其中大多数都已经过时,因为它们是在R-3.0.0之前构建的.现在我知道了

update.packages(checkBuilt=TRUE, ask=FALSE)

会更新我所有的软件包,但速度太慢了.问题是,用户不使用大多数软件包,他们有时会要求我更新他们使用的软件包(比如字段).现在如果我跑

install.packages("fields")

它只会更新包字段,但不会更新包映射,即使字段依赖于映射.因此,当我try 加载包字段时:

library("fields")

我收到一条错误信息

Error: package ‘maps’ was built before R 3.0.0: please re-install it

是否有一种方法可以升级字段,以便它也会自动更新字段所依赖的包?

推荐答案

正如Ben在 comments 中指出的,您需要获得fields的依赖项,然后过滤掉优先级为"Base""Recommended"的包,然后将包列表传递给install.packages()以处理安装.比如:

instPkgPlusDeps <- function(pkg, install = FALSE,
                            which = c("Depends", "Imports", "LinkingTo"),
                            inc.pkg = TRUE) {
  stopifnot(require("tools")) ## load tools
  ap <- available.packages() ## takes a minute on first use
  ## get dependencies for pkg recursively through all dependencies
  deps <- package_dependencies(pkg, db = ap, which = which, recursive = TRUE)
  ## the next line can generate warnings; I think these are harmless
  ## returns the Priority field. `NA` indicates not Base or Recommended
  pri <- sapply(deps[[1]], packageDescription, fields = "Priority")
  ## filter out Base & Recommended pkgs - we want the `NA` entries
  deps <- deps[[1]][is.na(pri)]
  ## install pkg too?
  if (inc.pkg) {
    deps = c(pkg, deps)
  }
  ## are we installing?
  if (install) {
    install.packages(deps)
  }
  deps ## return dependencies
}

这使得:

R> instPkgPlusDeps("fields")
Loading required package: tools
[1] "fields" "spam"   "maps"

哪个和

> packageDescription("fields", fields = "Depends")
[1] "R (>= 2.13), methods, spam, maps"

您会从sapply()if收到警告,deps中的依赖项实际上没有安装.我认为这些是无害的,因为在这种情况下返回的值是NA,我们用它来表示我们想要安装的软件包.如果你安装了4000个软件包,我怀疑这会影响你.

默认设置是not,用于安装软件包,但只返回依赖项列表.我认为这是最安全的,因为你可能没有意识到其中隐含的依赖链,最终意外地安装了数百个软件包.如果您愿意安装所示的软件包,请输入install = TRUE.

请注意,我限制了搜索到的依赖项的类型——如果使用which = "most",那么在递归解析这些依赖项(也包括Suggests:个字段)后,fields有300多个这样的依赖项.which = "all"将寻找所有东西,包括Enhances:,这将是一个更大的包裹 list .关于which参数的有效输入,请参见?tools::package_dependencies.

R相关问答推荐

从有序数据中随机抽样

R创建一个数据透视表,计算多个组的百分比

修改用R编写的用户定义函数

R Sapply函数产生的值似乎与for循环方法略有不同

在嵌套列表中查找元素路径的最佳方法

如何在R中描绘#符号?

R Read.table函数无法对制表符分隔的数据正常工作

DEN扩展包中的RECT树形图出现异常行为

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

Geom_Hline将不会出现,而它以前出现了

如何根据R中其他变量的类别汇总值?

正则表达式在第二个管道和第二个T之后拆分R中的列

在纵向数据集中创建新行

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

在不对R中的变量分组的情况下取两行的平均值

如何提取R中其他字符串和数字之间的字符串?

如何显示准确的p值而不是<;0.001*?

如何更改包中函数中的参数?

如何将字符类对象中的数据转换为R中的字符串

从不同长度的列中随机排序特定数量的元素