RとRStudioのインストール

ここでは,Dockerを使って,RとRStudioを利用する環境を構築する。R本体は,インターフェイスがコマンドラインなので,必ずしもユーザーフレンドリーではないが,統合環境であるRStudioを用いれば直感的に操作できる。RStudioを介してRを操作することで,コードを編集して実行したり,結果を確認したりといった一連の作業をシームレスに行うことができるので,現在では多くの人がRStudioを使ってRを操作している。

RやRStudioは,Windows版やMac版をローカル環境にインストールして使うこともできるが,分析の再現性や環境構築の簡略化のためにDockerを用いるのがおすすめ。Dockerを使えば,ホストマシンがWindowsであってもMacであっても,完全に同じ環境を作ることができる。

セットアップの流れ

とにかくセットアップしたい場合は以下の流れ。

  1. Docker Desktopをインストール
  • Macの場合 (ターミナル)
brew install DockerDesktop
  • Windowsの場合 (PowerShell)
winget install Docker.DokerDesktop
  1. githubからresearchenvレポジトリをクローン
  • githubに公開鍵を登録済みの場合
git clone git@github.com:tomokazu518/researchenv.git
  • githubに公開鍵を登録していない場合はzipファイルをダウンロードして展開

以下,Windowsの場合はWSLのUbuntuコマンドライン,Macの場合はターミナルでの作業

  1. researchenvフォルダに移動
  2. Dockerfileをビルド
docker build --rm -f "Dockerfile" -t researchenv:latest "."
  1. docker volumeを作成
docker volume create cache
docker volume create bin
  1. コンテナを起動
docker compose up -d
  1. RStudio Serverにアクセス
  1. コンテナのターミナル (RStudioのTerminalタブ)でセットアップスクリプトを実行
~/.config/init.sh

Dockerによる分析環境構築のメリット

Dockerは,目的ごとに作成された「コンテナ」と呼ばれる仮想環境を動かす仕組み。雑にいえば,パソコン (ホストマシン)の中で,別の小さなパソコン (コンテナ)を動かすようなもの。仮想マシンと違って完全なOS環境ではないので,より軽量で高速。

コンテナは,Dockerfileというファイルに,ベースとなるイメージを指定し,必要な設定やソフトをインストールするスクリプトを記述して,ビルドすることで作成する。たとえば,ここで用いるrocker/rstudioコンテナは,Ubuntu OSのベースイメージにR本体やRStudio Serverなどがインストールされており,ユーザーはブラウザでコンテナにアクセスしてRStudioを利用する。コンテナではUbuntu OSが動いているので,ホストマシンにかかわらずOSレベルで完全に同じ環境を再現することができる。

Rocker Projectでは,Rを利用するためのさまざまなバリエーションのコンテナが提供されており,セットアップのコストが最小限ですむ上に,OSに関係なく簡単に同じ環境を構築することができる。ここでは,プロジェクトで提供されているrocker/rstudioコンテナに,さらにいくつかよく使うものを追加でインストールしたコンテナを作成して用いる。

同じDockerfileからコンテナを作成すれば,ホストマシンのOSにかかわらず同じ分析環境を構築することができる。DockerコンテナはDockerfileを書き換えてビルドをやり直さない限り内容が変更されることはなく,一度コンテナを終了すれば,次回起動するときには初期状態に戻る。また,ホストマシンの環境とは分離されているので,知らない間に環境が変化する (Windowsアップデートが適用されてこれまで動いていたソフトが動かなくなるなど)ということも起こりにくい。

Figure 1: Dockerのイメージ

完全に同じ環境を構築できるということは,分析結果の再現性を担保するという観点から決定的に重要。たとえば,共同研究者の間でまったく同じデータを共有して分析する場合でも,共同研究者はWindowsを使っていたり,Macを使っていたりするだろう。また,分析に利用するR本体やRのパッケージも,すべての共同研究者が同じバージョンをインストールしているとは限らない。それにより,同じデータを分析しているにもかかわらず環境によって分析結果が異なる可能性がある。また,パッケージをアップデートすることにより,以前に得られた分析結果を自分でも後から再現できないということも起こりうる。

Dockerを使わずにインストールする方法

Dockerを使わずにRとRStudioをインストールする方法については,高知工科大学の矢内先生のホームページに,非常に丁寧な解説スライドが公開されている。Ubuntu,Mac,Windows版があるので,これらを参考にインストールすると良い。ただし,うまくいかなくても矢内先生に直接質問のメールを送ったりはしないこと。

導入準備

このセクションの作業はWindwosの場合はPowerShell (PowerShellで行うのは導入準備の部分だけで,あとはWSLのUbuntuのコマンドラインで行う),Macの場合はターミナルで行う。

Docker Desktopの導入

WSLのインストール

Windowsの場合は,WSL (Windows Subsystem for Linux)が必要。WSLをインストールしていない場合は,PowerShellから次のコマンドでUbuntuをインストール可能。

wsl --install Ubuntu

インストール後,ユーザー名とパスワードを聞かれるので,入力すればUbuntuが利用可能になる。WindowsターミナルでUbuntuを起動することもできるし,PowerShellからwslコマンド,もしくはUbuntuコマンドで,Ubuntuのコマンドラインに入ることもできる。

Docker Desktopをインストール

WSLをインストールして一度ログインしたら,次にDocker Desktopをインストールする。PowerShellから以下のコマンドでインストール可能。

winget install Docker.DokerDesktop

Docker Desktopインストール後は,必ずPCを再起動する。

PC再起動後にDocker Desktopのウィンドウが立ち上がるので,Setting > Resouces > WSL integrationに移動し,Enable integration with additional distros: のUbuntuをオンにする。これで,Ubuntuのコマンドラインからdockerコマンドが使えるようになる。

以下では,とくに断らない限り,Windowsの場合の操作はUbuntuのコマンドラインで行う。

Docker Desktopをインストール

Homebrewを使って,Docker Desktopをインストールする。ターミナルから以下のコマンドを実行。

brew install DockerDesktop

インストール後は,必ずMacを再起動する。

試してみる

Docker Desktopをインストールすれば,Rocker Projectのコンテナをダウンロードして起動することができる。何も設定していない状態では,データの読込み保存などはできないし,一度コンテナを終了すると作業内容は消えてしまうが,RStudio Serverがどういうものかを知るために,一度試してみると良い。

Ubuntuのコマンドライン (Windows),もしくはターミナル (Mac)で,以下のコマンドを入力すれば,コンテナのダウンロードと起動が行われる。

docker run --rm -ti -e PASSWORD=yourpassword -p 8787:8787 rocker/rstudio

コンテナが起動したら,ブラウザで, http://localhost:8787を開けばRStudio Serverにアクセスできる。ユーザー名はrstudio,パスワードはyourpasswordでアクセスできる。

gitの設定

gitの設定をしていない場合は,以下のコマンドでユーザー名とメールアドレスを設定する。

git config --global user.name "****** *****"
git config --global user.email "*******@***.***"

githubのアカウント作成と公開鍵の登録

githubのアカウントはいずれ必要になるのでここでまだ作成していない場合はここで作成しておこう。だれでも作成できるし,コストもゼロ。アカデミック登録すれば,Proの機能も無料で使える。とくにProではAIがコードを補完してくれるgithub copilotを無料で利用できるので,登録しておこう。

アカウントができたら,秘密鍵と公開鍵のペアを作成して,公開鍵をgithubに登録する。

まず,次のコマンドで秘密鍵と公開鍵のペアを作成する。

ssh-keygen
  1. 鍵を作成する場所を聞かれる。デフォルトの~/.sshで問題ないので,そのままEnter。
  2. パスフレーズを聞かれるので,設定する場合は入力してEnter。パスフレーズは設定しなくてもかまわない。設定しない場合は何も入力せずにEnter

これで,~/.sshid_ed25519というファイル (秘密鍵)と,id_ed25519.pub (公開鍵)というファイルが作成される。このうち,公開鍵の方をgithubに登録すれば,秘密鍵を使ってgithubにアクセスすることができる。公開鍵から秘密鍵を復元することはほぼ不可能なので,公開鍵はだれかに知られても問題ない。秘密鍵の方は,ほかの場所にコピーしたりだれかに見られたりすることがないように注意する。

githubに公開鍵を登録するには,githubのwebページ右上のアカウントのアイコンをクリックしてsettingsに入り,SSH and GPG keysを選ぶ。New SSH keyボタンを押せば,TitleとKeyを入力する画面になるので,Titleには適当に入力し,Keyには先ほど作成した公開鍵の内容をテキストエディタなどで開いてコピーして貼り付ける。テキストエディタなどを使わず,コマンドラインから以下のコマンドを実行することでもid_ed25519.pubの内容を表示させることができる。

cat ~/.ssh/id_ed25519.pub

公開鍵が登録できたら,sshコマンドでgithubにアクセスできるか確認する。

ssh git@github.com

成功すれば,以下のようなメッセージが表示される。

PTY allocation request failed on channel 0
Hi tomokazu518! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
Note

秘密鍵にパスフレーズを設定すれば,万が一秘密鍵が漏洩しても,パスフレーズなしではアクセスすることができないため,セキュリティは向上する。ただし,秘密鍵にパスフレーズを設定すると,使用するたびにパスフレーズの入力が必要になり,けっこう面倒くさい。秘密鍵のファイルを~.ssh/から移動したりコピーしたりしなければ,パスフレーズは設定しなくてもかまわないと思う。

Dockerのコンテナ作成と起動

リポジトリのクローン

githubにアクセスできたら,わたしのgithubレポジトリをクローンしてコンテナを作成する。

まず,ホームフォルダに移動して,githubのレポジトリをクローン (ダウンロード)する。ホームフォルダはWSLでもMacでも同じで/home/ユーザー名。ホームフォルダは~/でもアクセスできる。また,コマンドラインからcdとだけ打つとホームフォルダに移動することができる。

cd
git clone git@github.com:tomokazu518/researchenv.git

ホームフォルダに,researchenvというフォルダができるので,そのフォルダに入る。

cd researchenv

フォルダの中身を確認するには,lsコマンドを使う。

ls -la

フォルダ内には5つのファイルがあることを確認しよう。

  • Dockerfile
  • docker-compose.yml
  • .config/init.sh
  • .gitignore
  • README.md

Dockerイメージのビルド

Dockerfileは,Rocker Projectのrocker/rstudiコンテナをベースに,いくつか (わたしが)よく使うツールをインストールするためのスクリプトが記述されている。もし,ほかにもコンテナにインストールしておきたいものがあれば,Dockerfileに書き加えれば良い。

researchenvフォルダ内で次のコマンドを打てば,イメージをビルドできる。インターネットから大きなイメージファイルをダウンロードするので,初回のビルドにはかなり時間がかかる。通信環境の良いところで実行しよう。

docker build --rm -f "Dockerfile" -t researchenv:latest "."

Docker volumeの作成

追加でインストールするパッケージなどを保存する領域としてcache,シンボリックリンクなどを保存する領域としてbinというdocker volumeを作成する。これらのボリュームはそれぞれ/home/rstudio/.cache/home/rstudio/binにマウントする。

docker volume create cache
docker volume create bin
バインドマウントとdocker volume

Dockerはシャットダウンするとコンテナに加えられた変更がすべて初期状態に戻る。また,Dockerからはホスト側のファイルには直接アクセスすることができない。この仕組みが,意図せず環境が破壊されたり機密情報にアクセスされたりを防いでくれているわけだが,当然設定やデータを保存するための手段を用意する必要がある。

コンテナ内で作成したものを保存 (永続化)するには,ホスト側のフォルダやDocker volumeをコンテナにマウントする ( Figure 1 を参考)。

ホスト側のフォルダをマウントする方法をバインド・マウントといい,ホスト側のフォルダとコンテナ側のフォルダが同期されるので,コンテナから直接ホスト側のフォルダにアクセスしているのと同じ操作感になる。もう1つの方法は,Docker volumeを使うこと。Docker volumeはコンテナから読み書きするための専用の領域。

バインドマウントの問題は,コンテナ側とホスト側でファイルシステムが違うと,パフォーマンスが落ちるということ。コンテナはLinuxなので,WSL (Windows Subsystem for Linux)の場合は問題ないが,Macの場合はホスト側がMacのファイルシステムなので,Linuxのコンテナからアクセスすると速度が落ちる。一方で,Docker volumeはコンテナから高速にアクセスできるが,ホスト側からは簡単に内容を確認したり編集したりすることはできない。一長一短なので,目的に応じてバインドマウントとDocker volumeを使い分けるのが良いだろう。

ここでは,作成したコードや文書などはホスト側からもアクセスできると便利 (ホスト側にインストールされているアプリケーションで開いたり,別のPCにファイルをコピーしたりすることができる)なので,バインドマウントする。一方,追加でインストールするパッケージなどは,ホスト側で開くことはないし,パフォーマンスに影響する可能性があるので,Docker volumeを使う。

ただし,最近はMacのDockerでもバインドマウントのパフォーマンスが向上しているので,実用上問題がないと思えばバインドマウントの方が使い勝手は良い。とくに,

  - ./:/home/rstudio

としてしまえば,researchenvフォルダがそのままコンテナのホームフォルダになるので,マウントするのはこれだけで済むし扱いやすい。ただし,Rocker Projectのホームページでは,ホームフォルダをまるごとマウントするのは非推奨とされており,問題が起きる可能性はある。

コンテナの起動

起動には,docker composeを使う。docker-compose.ymlには,コンテナの環境変数の設定や,マウントするフォルダについての設定などが記述されている。以下の項目は,好みに応じて書き換えても良い。

  • environment
    • DISABLE_AUTH=true: ユーザー名 (“rstudio”で固定)とパスワードによる認証を無効にする。falseにするとパスワード認証が有効になる。
    • PASSWORD=rstudio: パスワード。
    • ROOT=true: sudoを許可するかどうか。
  • ports
    • 8787:8787: ポートを変更したい場合はここを書き換える。
  • volumes
    • ./.config/:/home/rstudio/.config: ホストマシンのresearchenv/.configフォルダが,コンテナの/home/rstudio/.configにマウントされる。おもにRStudioの設定などがここに保存される。
    • ./projects:/home/rstudio/projects: ホストマシンのresearchenv/projectsフォルダが,コンテナの/home/rstudio/projectsにマウントされる。プロジェクトごとにサブフォルダを作成してコードやデータ,文書などを入れる使い方を想定している。
    • ./.ssh:/home/rstudio/.ssh: ホストマシンのresearchenv/.sshフォルダが,コンテナの/home/rstudio/.sshにマウントされる。githubの秘密鍵などを保存する。
    • cache:/home/rstudio/cache: docker volumeのcacheが,コンテナの/home/rstudio/cacheにマウントされる。
    • bin:/home/rstudio/bin: docker volumeのbinが,コンテナの/home/rstudio/binにマウントされる。

コンテナを起動するには,次のコマンドを実行する。

docker compose up -d

コンテナが起動したら,ブラウザで, http://localhost:8787を開けばRStudio Serverにアクセスできる。chromeでアプリとして登録すれば,デスクトップ版のRStudioとまったく変わらない外観と操作性を実現できる。

Dockerコンテナにはユーザー名rstudioでログインされる。ホームフォルダは,/home/rstudiosudoを使えばroot権限でコマンドを実行できる。

Tip

セットアップスクリプトの実行

researchenv/.config/init.shを実行すれば,以下の設定が行われる。Latexを使わないなら,その部分を削除して実行すれば時間を短縮できる。Latexはあとからでもインストールできるので,すぐに使わない場合はここでインストールする必要はない。

~/researchenv/.config/init.sh
  • docker volumeをマウントするフォルダの所有者をrstudioに変更
  • HackGenフォントのインストール (RStudio Serverインターフェイス用)
  • Pythonのpipx用のフォルダを作成
  • Latexの設定
    • tinytexのRパッケージと本体のインストール
    • gnuplot-lua-tikz.styのインストール
texliveのフルインストール

tinytexはよくできていて便利だが,足りないパッケージをインストールする際に,インターネット接続が必須なのと,けっこう時間がかかるので,texliveをフルインストールしておくのも一案。だいたい2ギガくらいの容量が必要。

texliveのscheme-fullはtinytex導入後にtlmgrでインストールすることができる。

tlmgr install scheme-full("scheme-full")

RStudioの画面

RStudioを起動すると,細かい違いはあれ下のような画面が表示される。

Chromeでアプリとして登録したRStudio Serverの画面

デフォルトでは白背景の配色になっていると思うが,コードを書くときは黒や青背景の方が見やすいので変更している。見た目を変更するには,RStudioのメニューから[Tools]>[Global Options…]を選び,Appearanceで設定する。フォントについては,.config/init.shでインストールしたHackgenフォントがおすすめ。長時間の作業を行う場合には,色やフォントによって作業効率や目の疲れ方がけっこう変わってくるので,いろいろ試して自分にあった設定にしよう。

RStudioの画面は,デフォルトで4ペイン (4分割)。最初はそのまま使っても良いと思うが,画面のレイアウトは比較的自由に変えることができるので,慣れてきたら自分が使いやすいように設定しよう。

各ペインにはタブが複数配置されている。まずは,よく使うものだけ説明する。

  • Sourceペイン: デフォルトでは左上。何もファイルが開かれていない状態では最小化されているので,画面左上の+マークで新しいスクリプト・ファイル(R Script)を作成してみよう。
  • Consoleペイン: デフォルトでは左下。Rにコマンドを入力して実行するCosoleタブ,OS (Docker上のUbuntu)のターミナルを操作するタブ,バックグラウンドの処理をモニタするタブ。
  • Environmentなどのペイン: デフォルトでは右上。Environmentタブには記憶されている変数やデータなどが表示される。Historyタブには実行したコマンドの履歴が表示され,クリックすれば再度実行できる。
  • Filesなどのペイン: デフォルトでは右下。Filesタブには現在のディレクトリにあるファイルのリストが表示され,ファイル名をクリックすればファイルを開くことができる。Plotsタブはグラフなどが表示される場所。

RStudioの設定

  • フォントや画面の色といった外観のほかに,データの保存についても設定しておこう。

    • [Tools] > [Global Options…] のWorkspaceの項目で,Restore .RData into workspace at startupのチェックを外す
    • その下のSave workspace to .RData on exitをNeverに設定する
  • github copilotの設定

    • github copilotは,自動でコードを補完してくれるAI。あるとないとではコード作成の効率がまったく違うので,必須のツール。
    • githubのアカウントを作成して,アカデミック申請すれば無料で利用できる。
    • RStudioのメニューから[Tools] > [Global Options…] のGitHub Copilotの項目で,Enable GitHub CopilotをオンにするとSign inボタンが表示されるので,それを押してgithubのアカウントでログインする。
Tip

Rに限らず,統計ソフトでデータを分析するときには,元データのファイルをさまざまな形で加工 (前処理)することになる。このとき,加工したデータを保存することはなるべく避けた方が良い。間違えて元データを上書きしてしまうリスクがあるし,ファイルが増えると管理が大変になる。また,加工済みのデータを保存して,それを読み込んで作業をすると,加工のプロセスに間違いがあったとしても気づきにくくなる。

データ加工のプロセスで実行したコードは必ず記録し,毎回元データを読み込んで,記録したデータ加工のコードを実行するようにしよう。

前処理に時間がかかる場合など,やむを得ず前処理後のデータを保存して使う場合は,細心の注意を払おう。