我的系统(服务器)中安装了大约4000个R软件包,而且大多数软件包都是在R-3.0.0之前构建的。现在我明白了
@H_404_1@update.packages(checkBuilt=TRUE,ask=FALSE)
会更新我的所有包,但这太慢了。事情是用户不使用大多数的包,现在,然后他们要求我更新他们会使用的包(说字段)。现在如果我跑
@H_404_1@install.packages("fields")它只会更新包字段,但不会更新包映射,即使字段依赖于映射。因此,当我尝试加载包的字段:
@H_404_1@library("fields")我收到一条错误消息
@H_404_1@Error: package ‘maps’ was built before R 3.0.0: please re-install it
正如Ben在他的评论中指出的那样,您需要获取字段的依赖关系,然后将优先级“Base”或“Recommended”过滤掉,然后将该包列表传递给install.packages()来处理安装。就像是:
@H_404_1@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
}
这给出:
@H_404_1@R> instPkgPlusDeps("fields") Loading required package: tools [1] "fields" "spam" "maps"与之匹配
@H_404_1@> 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。