install.packages 安装量远远超过 package_dependencies

install.packages installs far more than package_dependencies

似乎package_dependencies没有报告所有的依赖关系, 或者 install.packages 走得太远了,太过火了。

例如,在 Ubuntu 16.04 上从源代码新安装的 R 3.5.0 中, package_dependencies 仅显示 colorspace 的 3 个依赖项。但是当我 安装 colorspace,其他 22 个软件包被拉入。

$ /sdata/ftp/rlang/tdi/bin/R --vanilla

...(R announcements)

.libPaths()
[1] "/sdata/ftp/rlang/tdi/lib64/R/library"
library( tools)
avail <- available.packages( repos="https://mirrors.nics.utk.edu/cran")
package_dependencies("colorspace", recursive=TRUE, db=avail)
$colorspace
[1] "methods"   "graphics"  "grDevices"



install.packages("colorspace", dependencies=TRUE,
   lib="/some/empty/dir",
   repos="https://mirrors.nics.utk.edu/cran")
also installing the dependencies ‘zoo’, ‘Rcpp’, ‘BH’, ‘magrittr’,
‘lmtest’, ‘httpuv’, ‘mime’, ‘jsonlite’, ‘xtable’, ‘digest’,
‘htmltools’, ‘R6’, ‘sourcetools’, ‘later’, ‘promises’, ‘crayon’,
‘rlang’, ‘kernlab’, ‘mvtnorm’, ‘vcd’, ‘dichromat’, ‘shiny’, ‘shinyjs’

为什么所有这些包裹都被拉进来了?

通过设置 dependencies=TRUE(而不是 NA 的默认值),您不仅会得到 imports/depends/linkingto,还会得到 建议的所有 个包裹:来自 ?install.packages

... ‘TRUE’ means to use ‘c("Depends", "Imports", "LinkingTo", "Suggests")’ for ‘pkgs’ and ‘c("Depends", "Imports", "LinkingTo")’ for added dependencies: this installs all the packages needed to run ‘pkgs’, their examples, tests and vignettes (if the package author specified them correctly).

package_dependencies 的模拟是 which="all"

length(package_dependencies("colorspace",
         recursive=FALSE,which="all")$colorspace)
## 15

length(package_dependencies("colorspace",
         recursive=TRUE,which="all")$colorspace)
## 1278

安装 22 个(而不是 15 个或 1278 个)新软件包的原因是 (1) 已经安装了一些软件包(例如 15 个直接建议:依赖项至少包括 6 个 base/recommended packages) 和 (2) 如上面文档块中所述,install.packages() 不递归地应用 Suggests: 要求 - 你得到所有直接的 Suggests: 依赖项,但只有二维顺序依赖项 需要(不建议)才能使它们正常工作。看看

lapply(package_dependencies("colorspace",
      recursive=FALSE,which="all")$colorspace, 
    package_dependencies)

shinyshinyjs 才是真正的罪魁祸首...)

如果 package_dependencies 的一个版本给出与 install.packages(...,dependencies=TRUE) 相同的结果,即在第一级采用所有建议的包,然后递归地查找所有需要的包,那就太好了. (对于中级 R 课程,这可能是一个很好的家庭作业...)


好吧,我有点疯了。我数 24,而不是 22,应该安装...? (我看了一下区别:你得到的是 23 个,而不是 22 个额外的包裹,第 24 个是 colorspace 本身......)

a1 <- available.packages()
i1 <- installed.packages()
order1 <- package_dependencies("colorspace",
                               db=a1,
                               recursive=FALSE,
                               which="all")$colorspace

order2 <- plyr::llply(order1,
                      package_dependencies,
                      db=a1,
                      recursive=TRUE,
                      .progress="text")

all_pkgs <- unique(c(order1,unlist(order2,recursive=TRUE)))
base_pkgs <- rownames(i1)[!is.na(i1[,"Priority"])]
setdiff(all_pkgs,base_pkgs)