ごゆるり日和

元気でヤンチャな子を推してるDSの備忘録など

Rの依存パッケージを一括で取得したい

初めに

この記事はRのアドベントカレンダーの17日目となります.

qiita.com

追記

自分の調査不足で記事が存在しておりました!!!

kyyonko.hatenablog.com 使いやすいし,ダウンロードまでしてくれるのでこちらを参考にしてください.

4月のお話(注意:事実とは異なる部分が含まれてます)

???「入社おめでとうございます.弊社はセキュリティーが厳しいので外部ネットワークに接続されてません.ですので,PythonやRのパッケージは申請してOKが出たらローカルの環境に入れることができます.」

私(...?!学生の頃より厳しい...?!)

起きたこと

私「glmnet 動かしたいからお伺いをたてるぞ」 私「その前に,一応document読んどくか」 私「ふむふむ,これ,glmnet以外にいくつかパッケージ必要じゃね?」 私「しかも,そのパッケージにまた必要なパッケージあるやん」 私「まあ,そんなに個数ないから目で調べてやるか」 私「あれ?調べて,お伺いをたてたら一日たったぞ???」 次の日 ???「ローカルにパッケージ入れていいよー」 私「これで動かせるぜ」 コンソール「install.package」 私「いい感じに動いたな」

翌月...

私「よーし,Rstan動かしたいからまたお伺いたてるぞ」 私「今回は前回より多いな」 私「まーいけるやろ」 私「また依存関係調べてたら一日が過ぎてしまった.」 次の日 ???「ローカルにパッケージ入れていいよー」 私「これで動かせるぜ」 コンソール「install.package」 R「足りないから動かないよ」 私「...うそん」

(注意:事実とは異なる部分が含まれてます)

やったこと

このような悲劇を二度と起こさないためにも, 一つのパッケージが依存しているパッケージを見つけ出したい!!

Rの関数に依存パッケージを表示してくれる関数tools::package_dependencies()があります. 今回はtidyverseを例にします.

> tools::package_dependencies("tidyverse")
$tidyverse
 [1] "broom"         "cli"           "crayon"        "dbplyr"       
 [5] "dplyr"         "dtplyr"        "forcats"       "googledrive"  
 [9] "googlesheets4" "ggplot2"       "haven"         "hms"          
[13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
[17] "modelr"        "pillar"        "purrr"         "readr"        
[21] "readxl"        "reprex"        "rlang"         "rstudioapi"   
[25] "rvest"         "stringr"       "tibble"        "tidyr"        
[29] "xml2"      

これらがtidyverseをインポートするときに必要となるパッケージとなります. さらに,これらが依存するパッケージを知りたいので次のような処理を行います.

> dependent_package <- tools::package_dependencies("tidyverse")[[1]]
> i <- 0
> while( i <= length(dependent_package) ){
  i = i + 1
  pack <- dependent_package[i]
  dependent_package <- unique(c(dependent_package, 
                         tools::package_dependencies(pack)[[1]]))
}
> 
> dependent_package
  [1] "broom"         "cli"           "crayon"        "dbplyr"       
  [5] "dplyr"         "dtplyr"        "forcats"       "googledrive"  
  [9] "googlesheets4" "ggplot2"       "haven"         "hms"          
 [13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
 [17] "modelr"        "pillar"        "purrr"         "readr"        
 [21] "readxl"        "reprex"        "rlang"         "rstudioapi"   
 [25] "rvest"         "stringr"       "tibble"        "tidyr"        
 [29] "xml2"          "backports"     "ellipsis"      "generics"     
 [33] "glue"          "methods"       "utils"         "grDevices"    
 [37] "assertthat"    "blob"          "DBI"           "lifecycle"    
 [41] "R6"            "tidyselect"    "vctrs"         "withr"        
 [45] "data.table"    "gargle"        "uuid"          "cellranger"   
 [49] "curl"          "ids"           "rematch2"      "digest"       
 [53] "grid"          "gtable"        "isoband"       "MASS"         
 [57] "mgcv"          "scales"        "stats"         "cpp11"        
 [61] "pkgconfig"     "mime"          "openssl"       "fansi"        
 [65] "utf8"          "clipr"         "vroom"         "tzdb"         
 [69] "Rcpp"          "progress"      "callr"         "fs"           
 [73] "knitr"         "rmarkdown"     "selectr"       "stringi"      
 [77] "tools"         "graphics"      "rappdirs"      "rematch"      
 [81] "nlme"          "Matrix"        "splines"       "farver"       
 [85] "labeling"      "munsell"       "RColorBrewer"  "viridisLite"  
 [89] "askpass"       "bit64"         "prettyunits"   "processx"     
 [93] "evaluate"      "highr"         "yaml"          "xfun"         
 [97] "htmltools"     "tinytex"       "jquerylib"     "lattice"      
[101] "colorspace"    "sys"           "bit"           "ps"           
[105] "base64enc"     "fastmap"      

(注意:ちょっと時間かかります.)

いい感じに依存パッケージを抽出できました! これで,いらない仕事をやらなくて済みます!

まとめ

いつか使う誰かのために...