我的系统(服务器)中安装了大约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。