install.packages的安装次数远远超过package_dependencies

时间:2018-06-17 00:48:50

标签: r installation-package

似乎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’

为什么所有这些包都被拉入了?

1 个答案:

答案 0 :(得分:5)

通过设置dependencies=TRUE(而不是默认值NA),您不仅可以获得导入/依赖/链接,还可以获得所有建议的包:来自?install.packages

  

...'TRUE'表示使用'c(“取决于”,“Imports”,“LinkingTo”,             “建议”)'为'pkgs'和'c(“取决于”,“进口”,             “LinkingTo”)'用于添加依赖项:这将安装所有             运行'pkgs'所需的包,他们的例子,测试和             小插图(如果包作者正确指定了它们)。

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个基本/推荐软件包)和(2)如上文文档块中所述,install.packages()不会递归地应用Suggests:要求 - 您将获得所有直接的Suggests:dependencies,但只需要所需的2d依赖 (不建议)让它们起作用。看看

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)
相关问题