【R】DockerでRStudioを使う個人的ベストプラクティス

:::note warn
この記事で紹介したDockerイメージのバージョン3.xがもうメンテされていないっぽい（[GitHubリポジトリ](https://github.com/rocker-org/rocker-versioned)が読み取り専用になっている）。
記事後半で4.xの使い方も紹介していので、今後はそっちを使った方がよさそう。
:::

## 概要
以前「[renvとdockerによるRの分析環境構築](https://qiita.com/dr666m1/items/19e4e90e07578631f193)」という記事を書いたのだが、あれから自分の思うベストプラクティスが変わったので改めて記事にする。

## 準備
Dockerが使えればOK。WindowsでWSL2を使うなら`.wslconfig`に以下を記載しておく。

```:.wslconfig
[wsl2]
localhostForwarding=True
```

## 手順
手順といっても **以下のコマンドでRStudioを起動するだけ！** あとはブラウザで`localhost:8787`にアクセスし、好きなようにRStudioを使えばよし！ただ、新規に[Project](https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects)を作るときはコツがるいるため以降で少し解説。

```bash
# aliasとして設定しておくと快適
docker container run \
  --rm \
  -e DISABLE_AUTH=true \
  -p 8787:8787 \
  -v $HOME/.renv:/home/rstudio/.local/share/renv \
  -v $(pwd):/home/rstudio/project \
  rocker/rstudio:3.6.3
```

### 新規にProjectを作成
まっさらなディレクトリから始めるとしよう。そのディレクトリでRstudioを起動したら、左上の`Create a project`→`Existing directory`と進み`~/project`（ホストマシンのワーキングディレクトリがここにマウントされている）を選んで`Create Project`を押す。まっさらだったディレクトリに`project.Rproj`というファイルができたはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540947/e3005e48-d95f-a38f-79e8-bee783e589a8.png)
Projectができたら[renv](https://rstudio.github.io/renv/articles/renv.html)の設定もしてしまおう。RStudioのコンソールで以下を実行する。

```R
install.packages("renv")
renv::init()
```

### 既存のProjectを利用
ProjectのディレクトリでRStudioを起動し`prject.Rproj`を選択すると既存のProjectを開ける。renvもちゃんと有効になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540947/0ea1ea5f-720f-fa73-de12-35011c157b53.png)

解説は以上。特に難しいことはないが、何か疑問があれば下のQ&Aを見てもらうとよいかと。

# Q and A


#### rocker/rstudioって何？
公式ページは[こちら](https://www.rocker-project.org/)。[公式ブログ](https://blog.rstudio.com/2020/07/01/announcing-public-package-manager/)でも紹介されるくらい人気のDockerイメージらしい。ちなみに`rocker/rstudio`で動かないパッケージがあれば、イメージは大きくなるが`rocker/tidyverse`・`rocker/verse`を順に試してみるとよさそう（諸々`apt-get install`済みだから）。

#### Rのバージョンはどう切り替えるの？
上記コマンドのタグ（`3.6.3`）を変更すれば簡単に他のバージョンを使える。利用可能なタグは[ここ](https://hub.docker.com/r/rocker/rstudio/tags)で確認できる。
ちなみに`4.0.0`[以降](https://github.com/rocker-org/rocker-versioned2)とそれ[以前](https://github.com/rocker-org/rocker-versioned)ではGitHubのリポジトリが違うためIssueを探すときは注意すること。そのタイミングで仕様についてもいくつか変更が加わっているてめ、READMEの[このあたり](https://github.com/rocker-org/rocker-versioned2#notes-on-new-architecture-for-r--400)見ておくとよさそう。そして、起動コマンドも以下のように変更が必要[^launch4]（`rocker/rstudio`ではなく`rocker/verse`を使っているのは、この[Issue](https://github.com/rocker-org/rocker-versioned2/issues/135)で議論されているWarningを回避できそうだから）。

```bash
# 4.0.0以降の起動コマンド
docker container run \
  --rm \
  -e DISABLE_AUTH=true \
  -e RENV_PATHS_CACHE=/renv \
  -p 8787:8787 \
  -v $HOME/.renv:/renv \
  -v $(pwd):/home/rstudio/project \
  rocker/verse:4.0.0
```

[^launch4]: 最初に紹介したコマンドだとroot権限で`/home/rstudio/.local/share`が作成されるのだが、それが`4.0.0`以降だと問題になるっぽい。逆に`4.0.0`以降用に紹介したコマンドを`3.6.3`とかで使うと、環境変数の受け渡しでうまくいかない。共通のコマンドにしたかったのだが断念。。。


#### インストールしたパッケージはどこにいくの？
`-v`オプションでホストマシンの`$HOME/.renv`を指定しているため、きちんとrenvが機能していればそこにキャッシュされる[^cache]（キャッシュが何だかわからない方は、ドキュメントの[このあたり](https://rstudio.github.io/renv/articles/renv.html#cache-1)を読むとよいかと）。キャッシュが機能していると`install.packages()`の際、以下のように`linked cache`と表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540947/fdc56986-36b7-55ec-59ca-0d82e99466b7.png)


[^cache]: 再現性を担保するため、基本的にrenvは使うべきだと思う。ホストマシン側にキャッシュされるからDockerコンテナが消えても問題ない、というのがポイント。

#### 前回の記事はDockerイメージにrenvを含めていたが？
[前回の記事](https://qiita.com/dr666m1/items/19e4e90e07578631f193)ではrenvをインストールしたDockerイメージを自前で用意したが、今回はしなかった。Dockerイメージを管理するのが面倒だというのが一番の理由。renvは必要なタイミングでわりと勝手にインストールされるし、Projectのディレクトリに保存されるから同一Projectで複数回インストールされるといった無駄もなさそうなので、問題ないかなと。


## まとめ
今回紹介した方法のメリットを改めてまとめておく。

* 環境構築が簡単（Dockerのインストールのみ）
* 再現性を担保しやすい[^reproducibility]（R本体はDockerだし、パッケージもrenvで管理）
* RのバージョンをDockerイメージのタグで明確に指定できる
* ホストマシンの環境を汚さない（renvのキャッシュができるのみ）

[^reproducibility]: 再現性を担保するなら、`set.seed()`とかも適切に使うこと。

また、本文中で触れなかったが、短所についても簡単にまとめておく。

* パッケージのインストールに時間がかかる場合がある[^install]
* ~~Dockerコンテナが変わるとRStudioの設定が一部引き継がれない（ProjectOptionsは引き継がれる。GlobalOptionsはだめ）~~`-v`オプションで設定ファイルを`/home/rstudio/.config/rstudio/rstudio-prefs.json`として渡せば解決

[^install]: Linuxだとインストール時に手元でコンパイルが走るため。`4.0.0`以降は[RSPM](https://packagemanager.rstudio.com/client/#/)がデフォルトになって改善したが、それでも手元でコンパイルが走ることはあるようだ。ホストマシンのスペック的にコンパイルが不可能な巨大パッケージは、つよつよ[GCE](https://cloud.google.com/compute/)でコンパイルしてキャッシュを手元に送るとかで対処。GCE使うのが面倒なら[CloudShell](https://cloud.google.com/shell)とかもけっこう強いよ。

そもそも自分は頻繁にRを利用するわけではないため、気づいていない問題点があったら申し訳ない。