更新特定的R包及其依赖关系

前端之家收集整理的这篇文章主要介绍了更新特定的R包及其依赖关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的系统(服务器)中安装了大约4000个R软件包,而且大多数软件包都是在R-3.0.0之前构建的。现在我明白了
update.packages(checkBuilt=TRUE,ask=FALSE)

会更新我的所有包,但这太慢了。事情是用户不使用大多数的包,现在,然后他们要求我更新他们会使用的包(说字段)。现在如果我跑

install.packages("fields")

它只会更新包字段,但不会更新包映射,即使字段依赖于映射。因此,当我尝试加载包的字段:

library("fields")

我收到一条错误消息

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

有没有办法升级字段,以便它也会自动更新包的字段取决于?

正如Ben在他的评论中指出的那样,您需要获取字段的依赖关系,然后将优先级“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"

如果没有实际安装deps中的依赖关系,则会从sapply()行中获取警告。我认为这些都是无害的,因为在这种情况下返回的值是NA,我们用它来表示我们要安装的软件包。如果您安装了4000个软件包,我怀疑它会影响您。

默认情况下不是安装软件包,而只是返回依赖关系的列表。我认为这是最安全的,因为您可能没有意识到依赖性链暗示,最终意外安装了数百个包。如果您乐意安装指定的软件包,请传入install = TRUE。

请注意,我限制搜索的依赖关系的类型 – 如果您使用which =“most”,那么一旦您递归地解析这些依赖关系(其中包括Suggests:fields),那么这些依赖关系就超过300个。 which =“all”将寻找所有内容包括Enhances:再次是更大的包列表。有关参数的有效输入,请参阅?tools :: package_dependencies。

猜你在找的设计模式相关文章