2021/10/17追記
いろいろ考え直したことがあり、新しい記事を書いた。
概要
Rを使う必要に迫られ、自分なりに環境を準備した際のメモ。以下の条件を満たす環境を目指す。
1. ローカルの環境を汚したくない
2. Rのバージョンを明確に指定可能、なおかつ適宜変更可能
3. 利用するパッケージをプロジェクトごとに管理可能(pythonにおけるvenvのイメージ)
4. 複数のプロジェクトで同じパッケージを利用する際、一度のインストールで済む
1,2
は使いたいバージョンのRがインストールされたdockerイメージを準備すれば解決。3
はrenvというRのパッケージをインストールするのが便利。4
はdocker run
の際に適切なオプションを指定する。
環境
私の環境は以下の通り。dockerを利用するので他の環境でも概ね問題ないはず。
- windows 10, version 2004
- Ubuntu 18.04 LTS (WSL2)
- docker 19.03.8 (Docker Desktopではない)
dockerイメージの準備
以下、必要なファイルの内容について解説する1。まずはDockerfile。
FROM r-base:4.0.0
COPY ./entrypoint.sh /
COPY ./init.R /
RUN apt update && \
apt install -y mecab mecab-ipadic-utf8 fonts-ipafont libmecab-dev && \
apt install -y libcurl4-openssl-dev libssl-dev libxml2-dev && \
Rscript /init.R && \
chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
1行目のr-base:4.0.0
はRの公式dockerイメージ。別のバージョンが必要なら4.0.0
の部分を変える。利用予定のRのパッケージが依存する機能はapt install
でインストールしておく。
Rscript
で実行しているinit.Rの内容は以下の通り、renvをインストールするのみ。
install.packages("renv")
ENTRYPOINT
で指定しているentrypoint.shの内容は以下の通り。/syncというディレクトリに移動してRを起動する。
#!/bin/bash
cd /sync
R
あとはローカルでビルドしてもいいが、私はGithubにpushしたらDockerHubで自動的にビルドされるよう設定しているのでそれを利用する。プライベートリボジトリではないので、誰でもdocker pull
できる2。
dockerイメージの利用
まずはプロジェクトのフォルダに移動。dockerが使える環境なら、以下のコマンドでRが起動する。末尾のタグでRのバージョンを変えられるようそのうち準備したい(まだlatest
しかない)。
docker run -it --rm -v $(pwd):/sync -v $HOME/.renv:/root/.local/share/renv dr666m1/myr:latest
-v
が2つあるが、1つ目はカレントディレクトリをdockerコンテナと共有している。2つ目はインストールしたRのパッケージの保存先を、ローカルの$HOME/.renv
に指定している。これを指定しておくことで、別のプロジェクトで同じパッケージを利用する際に無駄なインストールが走らない。
renvの使い方について詳しい説明はしないが、初回はrenv::init()
でプロジェクトの初期化をすること。
私の使い方
エディタはneovimを使うことが多いため、neotermを起動して以下3のように利用している。右半分でコードを書き、左半分でRを起動してコードを実行している。グラフはpngなどで保存して見に行くことになるため若干手間だが、今のところ好きなエディタを使えるメリットの方が大きい。