Rのパッケージの依存関係を色々調べたいときのメモ

CRANのパッケージ紹介ページ(?)にはReverse DependsとかReverse Importsみたいなフィールドがあります。

例:CRAN - Package ggplot2

これどうやってるんだろうな、と思ったら、その辺はtoolsパッケージにユーティリティがそろってるっぽいです。

available.packages()

CRANにあるパッケージ情報を引っ張ってこれます。

library(tools)
all_pkg <- available.packages()

head(all_pkg)
#>             Package       Version   Priority Depends                                     Imports          LinkingTo
#> A3          "A3"          "0.9.2"   NA       "R (>= 2.15.0), xtable, pbapply"            NA               NA       
#> abc         "abc"         "2.0"     NA       "R (>= 2.10), nnet, quantreg, MASS, locfit" NA               NA       
#> ABCanalysis "ABCanalysis" "1.0"     NA       "R (>= 2.10)"                               "Hmisc, plotrix" NA       
#> abcdeFBA    "abcdeFBA"    "0.4"     NA       "Rglpk,rgl,corrplot,lattice,R (>= 2.10)"    NA               NA       
#> ABCExtremes "ABCExtremes" "1.0"     NA       "SpatialExtremes, combinat"                 NA               NA       
#> ABCoptim    "ABCoptim"    "0.13.11" NA       NA                                          NA               NA       
#>             Suggests              Enhances License      License_is_FOSS License_restricts_use OS_type Archs MD5sum NeedsCompilation
#> A3          "randomForest, e1071" NA       "GPL (>= 2)" NA              NA                    NA      NA    NA     "no"            
#> abc         NA                    NA       "GPL (>= 3)" NA              NA                    NA      NA    NA     "no"            
#> ABCanalysis NA                    NA       "GPL-3"      NA              NA                    NA      NA    NA     "no"            
#> abcdeFBA    "LIM,sybil"           NA       "GPL-2"      NA              NA                    NA      NA    NA     "no"            
#> ABCExtremes NA                    NA       "GPL-2"      NA              NA                    NA      NA    NA     "no"            
#> ABCoptim    NA                    NA       "GPL (>= 3)" NA              NA                    NA      NA    NA     "no"            
#>             File Repository                           
#> A3          NA   "http://cran.rstudio.com/src/contrib"
#> abc         NA   "http://cran.rstudio.com/src/contrib"
#> ABCanalysis NA   "http://cran.rstudio.com/src/contrib"
#> abcdeFBA    NA   "http://cran.rstudio.com/src/contrib"
#> ABCExtremes NA   "http://cran.rstudio.com/src/contrib"
#> ABCoptim    NA   "http://cran.rstudio.com/src/contrib"

これは単純に、http://レポジトリ/src/contrib/PACKAGESというファイルを読んでるだけなので、contriburlパラメータにオレオレCRANのURLを指定すれば他のレポジトリのパッケージも取ってこれます

rforge_pkg <- available.packages(contriburl = contrib.url("http://rforge.net", getOption("pkgType")))
head(rforge_pkg)
#>          Package    Version Priority
#> ALA4R    "ALA4R"    "1.01"  NA      
#> Acinonyx "Acinonyx" "3.0-0" NA      
#> AntBioR  "AntBioR"  "0.03"  NA      
#> CADStat  "CADStat"  "2.2-5" NA      
#> Cairo    "Cairo"    "1.5-7" NA      
#> CarbonEL "CarbonEL" "0.1-4" NA      
#>          Depends                                                                           
#> ALA4R    NA                                                                                
#> Acinonyx "R (>= 2.5.0)"                                                                    
#> AntBioR  NA                                                                                
#> CADStat  "JGR, XML, lattice, bio.infer, gdata, gmodels, car, MASS,\nquantreg, rpart, rJava"
#> Cairo    "R (>= 2.4.0)"                                                                    
#> CarbonEL "R (>= 2.0.0), grDevices"                                                         
#>          Imports                                                                    LinkingTo Suggests           
#> ALA4R    "stringr, httr, plyr, digest, RCurl, jsonlite (>= 0.9.8),\nassertthat, sp" NA        "data.table, R.rsp"
#> Acinonyx NA                                                                         NA        NA                 
#> AntBioR  "stringr, httr, plyr, digest, RCurl, assertthat"                           NA        "data.table, R.rsp"
#> CADStat  NA                                                                         NA        NA                 
#> Cairo    NA                                                                         NA        "png"              
#> CarbonEL NA                                                                         NA        NA                 
#>          Enhances License License_is_FOSS License_restricts_use OS_type Archs MD5sum NeedsCompilation File
#> ALA4R    NA       NA      NA              NA                    NA      NA    NA     NA               NA  
#> Acinonyx NA       NA      NA              NA                    NA      NA    NA     NA               NA  
#> AntBioR  NA       NA      NA              NA                    NA      NA    NA     NA               NA  
#> CADStat  NA       NA      NA              NA                    NA      NA    NA     NA               NA  
#> Cairo    NA       NA      NA              NA                    NA      NA    NA     NA               NA  
#> CarbonEL NA       NA      NA              NA                    NA      NA    NA     NA               NA  
#>          Repository                     
#> ALA4R    "http://rforge.net/src/contrib"
#> Acinonyx "http://rforge.net/src/contrib"
#> AntBioR  "http://rforge.net/src/contrib"
#> CADStat  "http://rforge.net/src/contrib"
#> Cairo    "http://rforge.net/src/contrib"
#> CarbonEL "http://rforge.net/src/contrib"

ただし、devtools::install_github()でインストールするパッケージにはcontribがない(レポジトリがない)ので、この方法では取れません。。

tools::package_dependencies()

パッケージの依存関係を調べる関数です。reverse = TRUEを指定すると、そのパッケージに依存しているパッケージを調べられます。

rev_dep <- package_dependencies(packages = "ggplot2", all_pkg, which = "Depends", reverse = TRUE)
head(rev_dep$ggplot2)
#> [1] "alphahull"   "AmpliconDuo" "aoristic"    "apsimr"      "bcrm"        "bde"        
length(rev_dep$ggplot2)
#> [1] 141

ちなみに、依存を表すフィールドは、Depends以外にもImportsとかEnhances(見たことないけど...)とかありますが、"all"を指定するとそのへんまるっと調べてくれるらしいです。

rev_all <- package_dependencies(packages = "ggplot2", all_pkg, which = "all", reverse = TRUE)
head(rev_all$ggplot2)
#> [1] "abctools"    "abd"         "adegenet"    "alm"         "alphahull"   "AmpliconDuo"
length(rev_all$ggplot2)
#> [1] 434

これだけで434...。道のりの長さを感じます。

あと分からないこと

インストールしてないパッケージのDESCRIPTIONを見るのってどうすればいいんでしょう。。CRANにあるやつについてはミラーがGithub上にあるので、https://raw.githubusercontent.com/cran/パッケージ名/master/DESCRIPTIONを決め打ちしてread.dcf()すればいいんですけど、他のはやっぱパッケージをいちどダウンロードするしかないのかなあ。