はじめに
研究活動でRを使った統計解析を行うに際し、devboxを使ってホストOSを汚さずにRの実行環境を構築しました。VMのオーバーヘッドがないため軽量であり、ZedのLSP補完とAirによるフォーマットと併用すれば軽量かつ高速なR実行環境になります。
この記事は導入の流れとCRANからインストールしてくるパッケージ管理のハマりどころなどについて記述した備忘録です。

devboxとは
devboxはJetify社が開発するCLIツールで、Nixをバックエンドに使ったプロジェクトごとの隔離された開発環境を提供します。devbox.jsonに必要なパッケージを宣言し、devbox shellを実行するとそのパッケージだけが有効なシェルに入れます。
DevContainerのようなコンテナを実行するためのVMは使わずネイティブに実行されるため、オーバーヘッドがありません。またNixストアにパッケージが隔離されるためホストOSが汚れることもありません。
参考
なぜこの構成なのか
ホストOSを汚さないことを前提として環境を検討しました。真っ先に候補に挙がるのはDockerですが、Rで統計解析をするだけのためにDockerエンジン用のVMを動かし、さらにVSCodeのDev ContainersやRemote SSHで接続するというのは大掛かりすぎます。
軽量IDEのZedもDevContainerに対応しましたが、この機能はまだ発展途上であり、また統計解析という用途においてはそもそもDockerエンジンのVM層を動かすコストに見合わないと判断しました。
devboxであればVM層がなく軽量で、Zedとの連携もシンプルです。devbox.jsonをgitで管理するだけでDev containerと同等の環境再現性も確保できます。
参考にした記事
構築手順
1. devboxのインストール
curl -fsSL https://get.jetify.com/devbox | bash
完了後、devbox version でインストールを確認します。
2. プロジェクトの初期化
mkdir your-project && cd your-project
git init
devbox init
devbox init で devbox.json が生成されます。これが環境定義ファイルです。
3. RとLSPサーバーのインストール
devbox add r rPackages.languageserver
-
r: R本体 -
rPackages.languageserver: ZedのLSP補完に必要なRパッケージ
初回はNixストアへのダウンロードが走ります。
:::note warn
環境にNixが未インストールの場合、途中でインストールするか確認されるのでインストールして続行します。
:::
完了後の devbox.json はこのようになっているかと思います。
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.17.2/.schema/devbox.schema.json",
"packages": [
"r@latest",
"rPackages.languageserver@latest"
],
"shell": {
"init_hook": ["echo 'Welcome to devbox!' > /dev/null"],
"scripts": {
"test": ["echo \"Error: no test specified\" && exit 1"]
}
}
}
4. devbox shellの動作確認
devbox shell
R --version
プロンプトに (devbox) が付いたらdevbox環境の中にいる状態です。この環境内でのみRが使えます。exit で通常のシェルに戻ります。devbox内のRがインストールされたパスを確認します。
which R
# /your/project/.devbox/nix/profile/default/bin/R
このパスは後のZed設定で使います。
5. .gitignoreの作成
# devbox
.devbox/
# macOS
.DS_Store
# IDE
.zed/
.vscode/
# R
.Rhistory
.RData
# 生成物
output/
data/processed/
6. Zedの設定
Extensionsのインストール
Cmd+Shift+X でExtensionsを開き、以下をインストールします。
-
R: シンタックスハイライト・LSP補完(ocsmit/zed-r) -
Air: Rコードフォーマッター(posit-dev/air)
LSPラッパースクリプトの作成
ZedはGUIアプリとして起動するため、devboxのPATHを引き継ぎません。そのためRを起動するラッパースクリプトを用意し、devboxの環境変数をセットした上でRを起動するようにします。
プロジェクトルートに r-lsp-wrapper.sh を作成します。
#!/usr/bin/env bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
eval "$(devbox shellenv 2>/dev/null)"
exec R "$@"
実行権限を付与しておきます。
chmod +x r-lsp-wrapper.sh
.zed/settings.jsonの作成
mkdir -p .zed
.zed/settings.json に以下を記述します(パスは各自の環境に合わせて変更)。
{
"lsp": {
"r_language_server": {
"binary": {
"path": "/your/path/to/project/r-lsp-wrapper.sh",
"arguments": ["--slave", "--no-save", "--no-restore", "-e", "languageserver::run()"]
}
}
}
}
パスは pwd で確認できます。.zed/ はマシン固有の設定なのでgitignoreに追加しておくことにします。
7. ディレクトリ構成
ここで私が利用している統計解析プロジェクト紹介です。参考程度に。
your-project/
├── devbox.json # 環境定義
├── r-lsp-wrapper.sh # ZedのLSP用ラッパー
├── data/
│ ├── raw/ # 元データ(gitで管理)
│ └── processed/ # 加工済みデータ(gitで管理しない)
├── R/ # 自作関数
├── scripts/ # 分析スクリプト
└── output/
├── figures/ # グラフ出力先
└── tables/ # 集計表出力先
8. スクリプトの実行
devbox shell
Rscript scripts/your_script.R
対話モードで使う場合は R を起動します。
9. パッケージ管理
解析用パッケージもdevboxで管理します。
devbox add rPackages.tidyverse rPackages.sem
install.packages() による直接インストールはNixストアが読み取り専用のためエラーになります。
またnixpkgsのRパッケージはCRANのスナップショットから自動生成されており、主要パッケージはほぼカバーされています。
"The R-packages available in
<nixpkgs>are generated from a recent snapshot of CRAN."
— NixOS Wiki - R
インストール前に存在確認したい場合は以下で検索できます。
devbox search rPackages.パッケージ名
まとめ
この記事ではdevboxにRの実行環境を用意し、ZedでLSPを利用する方法についてまとめました。
R.appやRStudioをホストに導入せずにここまで手軽に整えられるのは、devboxの軽量さとnixpkgsの充実ぶりあってのものだと思います。
Rの環境構築の選択肢の一つとして少しでも参考になれば幸いです。