はじめに
みなさん rocker してますか? rocker を使うと Docker で R ± RStudio できるので
- 複数のマシンにセットアップ
- R本体やパッケージのバージョンを管理
といったことが簡単になって便利です.先日の Tokyo.R でも話題になりました (Rにおけるバージョン管理とプロジェクト運用 / rstudio-for-team by @u_ribo 氏)
GitPod に R を導入するのもとっても簡単ですヨ (atusy/gitpodr).
さて, rocker の Dockerfile
では
eddelbuettel/littler
パッケージ由来の
install2.r
を用い,R のパッケージの導入をシェルスクリプトらしい文法で実現しています. (下記).
install2.r --error --deps TRUE \
dplyr \
tidyr \
ggplot2
以下のように R のスクリプトを実行するより読み易くていいですね.
Rscript -e "install.packages(c('dplyr', 'tidyr', 'ggplot2'), dependencies = TRUE, error = TRUE)"
実装としては rocker/r-base
の Dockerfile の
52行目で,シンボリックリンクを貼ってシェルから実行できるようにしています.
ln -s /usr/lib/R/site-library/littler/examples/install2.r /usr/local/bin/install2.r
更に Dockerfile
を見ると全部で
install.r
install2.r
installGithub.r
testInstalled.r
が有効化されていますね.
では littler
やこれらのコマンドがナニモノか見ていきましょう.
littler とは?
OS用のアプリ (apt パッケージなど) としての littler
と Rパッケージとしての littler
がいるようです.
OS 用アプリとしての littler
apt show littler
によれば, “GNU R scripting and command-line front-end” とのことで,ターミナル上での R スクリプト実行を容易にしてくれるもののようです.
yutannihilation 氏による紹介記事もあります (littlerを使ってRで危険シェル芸とかできそう).
以下のように,Rコマンドを文字列として渡すことでシェル上で実行できるようになります.
r -e 'print("Hello World!")'
また,行頭には #!/usr/bin/env r
と Shebang
を記た hello.r
を用意し,
#!/usr/bin/env r
print("Hello World!")
実行可能にするとちゃんと走ります.
chmod +x hello.r
./hello.r
# [1] Hello World!
R パッケージとしての littler
OS 用 littler の実行ファイルと,サンプルスクリプトの詰め合わせ……かな?
実行ファイルは,
system.file("bin", "r", package="littler")
にあるので,これを PATH の通った場所にシンボリックリンクしてやれば,手動で OS 用アプリとしての littler をインストールできるようです.
サンプルスクリプトは inst/examples にいっぱいありますが,今回は rocker で利用できるもののみ紹介します.
rocker で使える littler 由来の R スクリプト
install.r
シンプルな CRAN 上の R パッケージインストール用スクリプト.引数にはインストールしたいパッケージしか指定できない.インストール時の細かい挙動を弄りたい人は install2.r
へ.
簡単な用例:
install.r dplyr tidyr
install2.r
CRAN 上の R パッケージをインストールするための,ちょっとリッチなスクリプト.以下の様々な引数を利用できる.
-l --libloc LIBLOC パッケージインストール先
[default: /usr/local/lib/R/site-library]
-d --deps DEPS 依存しているパッケージをインストールするか
[default: NA]
-n --ncpus NCPUS インストールを並列化する時のスレッド数
[default: getOption]
-r --repos REPOS 参照するレポジトリ.複数可.ファイルからなら NULL を指定.
[default: getOption]
-e --error 警告をエラー扱いにしてスクリプトを停止させるか
[default: FALSE]
-s --skipinstalled インストール済みのパッケージのインストールはスキップするか
[default: FALSE]
-h --help install2.r のヘルプを見る
-x --usage ヘルプと簡単な用例を見る
簡単な用例は
install2.r dplyr tidyr --error --deps TRUE
で R でいうところの
install.packages(c("dplyr", "tidyr"), error = TRUE, dependencies = TRUE)
に相当.
TIPS: --ncpus -1
すると最大限並列化できる
ソースを見て気付いた (68行目).
これは R の install.packages が ncpu に正の整数しか指定できないこととの大きな違い.
Docker で複数のパッケージのインストールに時間がかかっている人には朗報だろう.
TIPS: rocker 派生には --skipinstalled
が便利そう
オレオレ verse を作るとき,このパッケージは既にインストール済みだろうか……?インストール済みなのにまたインストールするとビルドに時間がかかるな…….
などと悩むくらいならこれを有効にしておくとよい.
installGithub.r
GitHub 上の R パッケージをインストールするためのスクリプト.中身は remotes::install_github
のラッパー.以下の様々な引数を利用できる.
-d --deps DEPS 依存パッケージをインストールするか
[default: NA]
-u --update UPDATE 依存パッケージをアップデートするか
[default: TRUE]
-r --repos REPOS 依存パッケージをインストールする時に使うレポジトリ
[default: getOption]
-h --help ヘルプを表示
-x --usage ヘルプと用例を表示
簡単な用例:
installGithub.r RcppCore/[email protected]
TIPS: pkg@branch
などブランチやバージョンの指定が可能.
remotes::install_github
だからね.詳しくはremotes::install_github
のドキュメントを参照.
testInstalled.r
インストール済みのパッケージをテストするためのスクリプトで,
tools::testInstalledPackage
のラッパーらしい.
-l --libloc LIBLOC パッケージのインストール先
[default: NULL]
-o --outdir OUTDIR 結果の保存先
[default: .]
-t --types TYPES テスト内容
[default: c('examples', 'tests', 'vignettes')]
-s --srcdir SRCDIR 追加したい .save ファイルの参照先
[default: NULL]
-h --help ヘルプを表示
Enjoy!
remotes::install_github
は可変長引数を使って install.packages
の引数を指定できるので,
installGithub.r
にも是非 --ncpus
が欲しいなあ…….
PR の機運?