DevContainerを利用してVSCode・CursorでRのコーディング環境を整える

# はじめに

PythonのIDEとしてVSCodeやその派生であるCursorは使いやすく、デバッグも容易で非常に便利です。しかし、VSCodeやCursorでRを扱おうとすると、クラッシュしたり、Rのアタッチが上手くいかなかったりと、不安定であると感じていました。

Rを扱えるIDEとしてVSCodeをベースに開発されているPositronというものもあります。こちらはVSCodeの拡張機能やテキストエディタとしての機能を利用してRを扱うことができ、快適にRのコーディングをすることができます。また、開発が進んだことで動作が安定してきたため、Rのデファクトスタンダードとも言えるRStudioよりも快適にRを扱えるようになってきたと個人的には感じています。しかし、今、発展が進んでいる生成AIとの統合という点では遅れており、Clineを拡張機能で追加することはできますが、物足りなさを感じてしまいます。

一方で生成AIとの統合が進んでいるVSCode・CursorにはDevContainerという機能が搭載されています。この機能は、Dockerコンテナを利用することで独立したコーディング環境を作成することができます。この機能を使ってRの環境を整えてみてはどうかと思い立ち、整えてみたところ、VSCode・CursorでRが安定して動作するようになりました。生成AIの支援を受けながらRのコードを編集して実行できるという点で、非常に快適になりました。

そこで、この記事ではVSCode・CursorのDevContainerを利用して、Rの開発環境を整える方法を紹介していきたいと思います。

# 環境

DockerDesktopとVSCode・Cursorがすでにインストールされていることを前提とします。

# 手順

## 1. プロジェクトの作成

任意の場所にプロジェクト用のフォルダを作成し、そのフォルダをVSCode・Cursorで開きます。

## 2. DevContainerの作成

プロジェクト用フォルダの中に`.devcontainer`フォルダを作成し、その中に以下のファイルを作成します。

- `devcontainer.json`
- `Dockerfile`
- `docker-compose.yml`

## 3. Dockerfileの作成

``` dockerfile
FROM rocker/r-ver:4.5.0

# 日本語設定
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV TZ=Asia/Tokyo

RUN apt-get update -y && \
    apt-get upgrade -y && \
    apt-get dist-upgrade -y && \ 
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apt-get clean

# 日本語フォントのインストール
RUN apt-get update && \
    apt-get install -y fonts-ipaexfont fonts-noto-cjk && \
    apt-get clean

# 必要なLinuxライブラリーのインストール
RUN apt-get install -y wget unzip git pandoc && \
    apt-get clean
# Rのためのライブラリ
RUN apt-get install -y libcurl4-openssl-dev libssl-dev libxml2-dev libfontconfig1-dev libharfbuzz-dev libfribidi-dev libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev cmake && \
    apt-get clean

# 最低限Python設定
RUN apt-get install -y python3.12 python3.12-dev python3-pip python3.12-venv && \ 
    apt-get clean
RUN python3.12 -m venv ~/venv
RUN ~/venv/bin/pip install --upgrade pip
RUN ~/venv/bin/pip install radian
RUN ~/venv/bin/pip install numpy pandas openpyxl ipykernel
RUN ~/venv/bin/pip install jupyter jupyter-client notebook
RUN ~/venv/bin/python -m ipykernel install --user
ENV PATH="/root/venv/bin:${PATH}"

# 必要なRパッケージのインストール
RUN R -e "install.packages('languageserver', repos='https://p3m.dev/cran/latest')"
RUN R -e "install.packages('vscDebugger', repos = 'https://manuelhentschel.r-universe.dev')"
RUN R -e "install.packages('reticulate')"
RUN R -e "install.packages(c('tidyverse', 'patchwork'))"
```

### Dockerfileの解説

```dockerfile
FROM rocker/r-ver:4.5.0
```

`rocker/r-ver:4.5.0`はベースとなるDockerイメージです。DockerHubでベースとなるDockerイメージを探してきて指定します。ここではR4.5.0の[rocker/r-ver](https://hub.docker.com/r/rocker/r-ver)を指定しています。

<br>

```dockerfile
# 日本語設定
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV TZ=Asia/Tokyo

RUN apt-get update -y && \
    apt-get upgrade -y && \
    apt-get dist-upgrade -y && \ 
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apt-get clean
```

コンテナ内部のOS環境（Ubuntu 24.04.2 LTS）の設定を行なっています。`ENV`は環境変数を設定するDockerのコマンドです、`RUN`はLinuxコマンドを実行するためのコマンドです。これらのDockerコマンドの後ろにLinuxコマンドを記述することで、コンテナ内部のOS環境設定・パッケージのインストールをすることができます。

<br>

```dockerfile
# 最低限Python設定
RUN apt-get install -y python3.12 python3.12-dev python3-pip python3.12-venv && \ 
    apt-get clean
RUN python3.12 -m venv ~/venv
RUN ~/venv/bin/pip install --upgrade pip
RUN ~/venv/bin/pip install radian
RUN ~/venv/bin/pip install numpy pandas openpyxl ipykernel
RUN ~/venv/bin/pip install jupyter jupyter-client notebook
RUN ~/venv/bin/python -m ipykernel install --user
ENV PATH="/root/venv/bin:${PATH}"
```

コンテナ内部のPythonの設定を行なっています。Rのデフォルトのコンソールとして`radian`を使いたいので`radian`を使うのに必要なPython環境を整えています。また、`Jupyter`も使えるようにしておきたいのでその設定もしています。CSVファイルやエクセルファイルの中身を確認するのに、VSCodeの拡張機能である`datawrangler`が使えると便利なので、そのためのPython環境も整えています。

<br>

```dockerfile
RUN R -e "install.packages('languageserver', repos='https://p3m.dev/cran/latest')"
RUN R -e "install.packages('vscDebugger', repos = 'https://manuelhentschel.r-universe.dev')"
RUN R -e "install.packages('reticulate')"
RUN R -e "install.packages(c('tidyverse', 'patchwork'))"
```

コンテナ内部のRの設定を行なっています。`languageserver`はVSCodeでRのコーディングを支援するためのパッケージで、`vscDebugger`はVSCodeでRのデバッグを支援するためのパッケージです。この2つのRパッケージはVSCodeのRの拡張機能である`R`と`R Debugger`をインストールした後に必要になるので必ずインストールしてください。`reticulate`はPythonとRを連携させるためのパッケージで、`tidyverse`と`patchwork`はデータ分析で最低限インストールされていると便利だなと個人的に思っているパッケージです。

## 4. docker-compose.ymlの作成

```dockerfile
services:
  r-env:
    build: .
    shm_size: '4gb' # シェアメモリのサイズ(デフォルトは64MB, 大きいデータを扱う場合を想定)
    volumes:
      - ../:/workspace # ワークスペースのディレクトリをコンテナのworkspaceディレクトリにマウント
```

ここでは、コンテナの起動を行う時の設定を記述しています。それぞれの意味はコメントアウトの通りです。

便利なのが、`volumes`でホストのディレクトリをコンテナのディレクトリにマウントできるところです。`docker-compose.yml`のディレクトリを基準に、コンテナにマウントしたいディレクトリを相対パスで指定します。こうすることで、DevContainerを起動した後もホストのディレクトリを参照することができます。

## 5. devcontainer.jsonの作成

```json
{
	"name": "R Analysis", //VSCodeで表示されるDEVコンテナ名
	"dockerComposeFile": ["./docker-compose.yml"],
	"service": "r-env",
	"forwardPorts": [], 
	"workspaceFolder": "/workspace", //VSCodeで開くコンテナ内のディレクトリ
	"customizations": {
		"vscode": {
			"extensions": [
				"mechatroner.rainbow-csv",
				"mosapride.zenkaku",
				"ms-python.python",
				"ms-python.vscode-pylance",
				"VisualStudioExptTeam.intellicode-api-usage-examples",
				"VisualStudioExptTeam.vscodeintellicode",
				"ms-toolsai.datawrangler",
				"ms-toolsai.jupyter",
				"ms-toolsai.vscode-jupyter-cell-tags",
				"ms-toolsai.vscode-jupyter-slideshow",
				"ms-toolsai.jupyter-keymap",
				"REditorSupport.r",
				"RDebugger.r-debugger"
			],
			"settings": {
				"workbench.editor.enablePreview": true,
				"r.bracketedPaste": true,
				"r.session.watchGlobalEnvironment": true,
				"r.alwaysUseActiveTerminal": false,
				"r.sessionWatcher": true,
				"r.lsp.debug": true,
				"r.lsp.diagnostics": true,
				"r.rpath.linux": "/usr/local/bin/R",
				"r.rterm.option": [
					"--no-save",
					"--no-restore"
				],
				"r.rterm.linux": "/root/venv/bin/radian",
				"python.venvPath": "/root/venv",
				"datawrangler.pythonPath": "/root/venv/bin/python"
			}
		}
	}
}
```

`extensions`の中にVSCodeの拡張機能を指定することで、DevContainerを起動した後にVSCodeの拡張機能が自動的にインストールされます。この拡張機能の設定は、拡張機能のタブの設定で`Add to devcontainer.json`を選択すると自動で設定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/587b86a6-9042-4939-831b-029bc6e8bdc6.png)


`settings`の中には、VSCodeの設定を記述します。記述しておくことで、DevContainerを起動した後にVSCodeの設定が自動的に適用されます。

## 6. コンテナの起動

DockerDesktopが起動している状態で、F1キーを押してコマンドバーで`Dev Containers: Reopen in Container`を実行するか、`Dev Containers: Open Folder in Container...`を実行してプロジェクトフォルダを選択、ワークスペースを作成している場合には`Dev Containers: Open Workspace in Container`を実行してワークスペースを選択すると、DevContainerを起動することができます。


## 参考

https://mom-neuroscience.com/vscode-r/

https://qiita.com/Ikuyadeu/items/ac8f0852a953829151dd