我的系统(服务器)中安装了大约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在评论中指出的,您需要获得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相关问答推荐

如何强制我的向量拆分为参数?

根据特定列中的数据框条目添加新列的最快方法是什么

矩阵:根据变量名对列和行求和

如何对所有 NA 为 0/NA 的行求和

逐列返回最常见的值,将该列中的 null 替换为该值

在ggplot中将包含上标文本的后缀添加到轴文本

R滚动添加或删除计数到列表

点到不在同一组中的点的最近邻距离

更改输入值时不要清除(用户输入的)react 变量的值

如何计算R中每一行的每一列的周期总和

根据其他两列的范围信息创建和填充新列

删除不增加基于其他列值的行

R Plotly Bar Chart - 添加水平线标记

筛选包含列表中的值的行

如何用R绘制双坐标CDF和PDF

使用 dplyr 进行动态编程 - 使用动态输入改变多个动态列

如何从具有数据的其他行推断 R 数据框中的缺失值?

考虑到 position='dodge' 的条形,如何在柱状条形图上添加线条,其中线条通过条形的中间顶部?

使用 R 在 map() 中更新循环外的向量

根据 dplyr 中的开始和停止日期生成新变量