レプリケーション駆動な研究のために
August 31, 2023
“I shall certainly admit a system as empirical or scientific only if it is capable of being tested by experience.”
–Karl Popper, 1934
研究が社会科学足るために再現性はその要件である
レプリケーションは研究の前提であり, 過程であり, ゴールである
here::here()
で対応可能. Pythonの場合 pyprojroot.here()
renv
を用いてバージョンを記録する. Pythonの場合 venv
, poetry
などrenv
はRのバージョンを切り替えることができないので, 手動で切り替えるか常に最新版を用いるなどで対応USER/IMAGE:TAG
で指定する. TAG
を省略するとlatest
が指定されるWSL: Connect to WSL
を選択handson1
) を作成するOpen Folder in Container
を選択. 作成したフォルダを選び, Ubuntu
を選択. 残りの選択肢はデフォルトのままでOK.devcontainer/devcontainer.json
という設定ファイルが作成されるFROM
: ベースとなるイメージを指定ENV
: 環境変数を設定. Ubuntuの場合はDEBIAN_FRONTEND
はこの設定が必要RUN
: シェルコマンドを実行
apt update
: パッケージリストを更新apt install
: パッケージインストール (-y
はすべてに自動でyesを返す)Reopen Folder in WSL/Locally
を選択.devcontainer/devcontainer.json
を一度削除するReopen in Container
を選択
whoami
)Reopen Folder in WSL/Locally
を選択FROM ubuntu
ENV DEBIAN_FRONTEND noninteractive
RUN apt update && apt install -y git
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
USER $USERNAME
.devcontainer/devcontainer.json
のremoteUser
をvscode
に変更するRebuild and Reopen in Container
を選択whoami
)rocker
プロジェクトrocker/rstudio
またはrocker/geospatial
を使うことが多いrstudio
というユーザが用意されているイメージ | ベースイメージ | 概要 |
---|---|---|
rocker/r-ver | ubuntu | Ubuntu + R |
rocker/rstudio | rocker/r-ver | + RStudio Server |
rocker/tidyverse | rocker/rstudio | + tidyverse & devtools |
rocker/verse | rocker/tidyverse | + tinytex & 組版関係のパッケージ |
rocker/geospatial | rocker/geospatial | + 地理情報用パッケージ |
通常のRStudio Server
コンテナ内のRStudio Server
バインドマウント
ボリューム
docker-compose.yml
ファイルにコンテナ起動の際の設定を記述することができるhandson2
)Dockerfile
を作成しFROM rocker/rstudio
と記述し保存docker-compose.yml
と.devcontainer/devcontainer.json
を作成するRebuild and Reopen in Container
を選択するlocalhost:8787
にアクセスする以下のようなDockerfile
でコンテナの中にRパッケージをインストールできる
しかしこの方法はいくつかの問題がある
Dockerfile
を書き換える必要があるこれらはrenv
のキャッシュをDocker Volumesに保存することで解決できる
renv
によるパッケージ管理renv::init()
renv/
フォルダとrenv.lock
ファイルを作るrenv::snapshot()
renv.lock
ファイルに自動的に記録されるrenv::restore()
renv::restore()
を実行することでrenv.lock
の情報からパッケージを自動でインストールできるrenv.lock
{
"R": {
"Version": "4.3.1",
"Repositories": [
{
"Name": "CRAN",
"URL": "https://packagemanager.posit.co/cran/latest"
}
]
},
"Packages": {
"dplyr": {
"Package": "dplyr",
"Version": "1.0.10",
"Source": "Repository",
"Repository": "RSPM",
"Hash": "539412282059f7f0c07295723d23f987",
"Requirements": [
"R6",
"generics",
"glue",
"lifecycle",
"magrittr",
"pillar",
"rlang",
"tibble",
"tidyselect",
"vctrs"
]
},
}
}
renv
のキャッシュrenv
は各Rの各パッケージのバージョンごとにグローバルキャッシュを持っているrenv/
フォルダ内に収められているが, 実体はシンボリックリンクが張られたグローバルキャッシュにあるrenv
renv
用のDocker Volumeを作成する
docker volume create renv
docker-compose.yml
, Dockerfile
を以下のように書き換える
chown
でrenv
ディレクトリの所有者をrstudio
にしているRebuild and Reopen in Container
を選択するrenv
を用いてパッケージを記録するDockerfile
, docker-compose.yml
, .devcontainer.json
を修正する.
Rebuild and Reopen in Container
を選択するrenv
を用いてパッケージをインストールするRebuild and Reopen in Container
を選択するinstall.packages(c("rlang", "jsonlite", "rmarkdown"))
を実行するrenv::restore()
を実行するindex.qmd
を開き, Ctrl-Shift-Kでスライドがビルドされることを確認するより詳しい使い方はZenn記事 を参考のこと
.pem
ファイルがダウンロードされる
.ssh
フォルダに保存するchmod 400
で.pem
ファイルのパーミッションを変更するSpeedtest CLI
speedtest
をターミナルで実行するdockerのインストール
sudo amazon-linux-extras install -y docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ubuntu
docker-composeのインストール
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m) \
-o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
ubuntu
ユーザーをdocker
をsudoなしで実行できるようにしているexit
で一度ログアウトするRemote-SSH
拡張機能をインストール~/.ssh/config
に以下のように記述するRemote-SSH: Connect to Host...
でrabootcamp
を選択Caution
ハンズオンの終了時には必ずインスタンスを停止すること. 今後使う予定がない場合は終了してもよい.
インスタンスの切り忘れが怖い
IPアドレスが毎回変更されてしまうのが面倒
AWS上のコンテナ内でGitHubと通信したい
Udemy講座 (かめ) ・ Zenn記事 (柳本) ・ Notion記事 (神戸大 山﨑先生)