renv(再現可能な実行環境)
『R』において、renvパッケージはプロジェクトごとにパッケージのバージョンを固定し、異なる環境・異なるメンバー間でも同一の再現性ある実行環境を構築するためのツールです。renv::init() でプロジェクトを初期化し、renv::snapshot() で現在の状態をロックファイルに記録し、renv::restore() でその状態を完全に再現することができます。チーム開発や長期運用プロジェクトでパッケージバージョンの差異によるトラブルを防ぐ際に非常に有効です。
構文
# -----------------------------------------------
# renv::init() — プロジェクトを renv で初期化します
# -----------------------------------------------
renv::init()
# プロジェクトルートに renv/ ディレクトリと renv.lock を作成します
# 既存の install.packages() 履歴を自動検出してロックファイルに反映します
# -----------------------------------------------
# renv::snapshot() — 現在の環境をロックファイルに記録します
# -----------------------------------------------
renv::snapshot()
# 現在インストールされているパッケージとバージョンを renv.lock に書き出します
# 引数 type="explicit" を指定すると DESCRIPTION 記載パッケージのみ対象にできます
renv::snapshot(type = "explicit") # DESCRIPTION に記載されたパッケージのみ記録します
# -----------------------------------------------
# renv::restore() — ロックファイルの状態に環境を戻します
# -----------------------------------------------
renv::restore()
# renv.lock に記録されたバージョンのパッケージを一括インストール・復元します
# 新しいメンバーがリポジトリをクローンした後に実行することで環境を揃えられます
# -----------------------------------------------
# renv::install() / renv::remove() — パッケージの追加・削除
# -----------------------------------------------
renv::install("dplyr") # 最新版をインストールします
renv::install("dplyr@1.1.0") # バージョンを指定してインストールします
renv::install("tidyverse/dplyr") # GitHub リポジトリからインストールします
renv::remove("dplyr") # パッケージをプロジェクト環境から削除します
# -----------------------------------------------
# renv::status() — 環境とロックファイルの差分を確認します
# -----------------------------------------------
renv::status()
# ロックファイルと現在のインストール状態のズレを報告します
# "The project is already synchronized." と表示されれば一致しています
# -----------------------------------------------
# renv::update() — パッケージを最新版に更新します
# -----------------------------------------------
renv::update() # 全パッケージを最新版に更新します
renv::update("ggplot2") # 指定パッケージのみ更新します
構文一覧
| 構文/関数 | 概要 |
|---|---|
renv::init() | プロジェクトを renv 管理下に置き、renv/ ディレクトリと renv.lock を生成します。 |
renv::snapshot() | 現在インストールされているパッケージのバージョン情報を renv.lock に書き出します。 |
renv::restore() | renv.lock に記録された状態を再現し、パッケージを一括インストール・復元します。 |
renv::install("パッケージ名") | 指定したパッケージをプロジェクト環境にインストールします。バージョン指定や GitHub 指定も可能です。 |
renv::remove("パッケージ名") | 指定したパッケージをプロジェクト環境から削除します。 |
renv::update() | インストール済みパッケージを最新版に更新します。パッケージ名を指定すると個別更新できます。 |
renv::status() | ロックファイルと現在の環境の差分を報告します。同期済みかどうかを確認できます。 |
renv::activate() | 既存の renv 環境を有効化します。.Rprofile 経由で自動実行されることが多いです。 |
renv::deactivate() | プロジェクトの renv 管理を無効化し、グローバルライブラリに切り替えます。 |
renv::dependencies() | プロジェクト内のスクリプトが依存するパッケージ一覧を自動検出して返します。 |
renv::clean() | ロックファイルに記録されていない不要パッケージをプロジェクト環境から削除します。 |
サンプルコード
renv_packrat.R
# renv_packrat.R — renv によるプロジェクト環境管理のデモスクリプトです
# 龍が如く キャラクターの人物データを使って
# パッケージのインストール・スナップショット・ステータス確認の流れを再現します
# -----------------------------------------------
# renv パッケージの読み込み
# -----------------------------------------------
# renv が未インストールの場合は install.packages("renv") で導入してください
library(renv)
cat("=== renv バージョン確認 ===\n")
cat(paste("renv version:", packageVersion("renv"), "\n\n"))
# -----------------------------------------------
# プロジェクト状態の確認(init 済み前提)
# -----------------------------------------------
# 本スクリプトは renv::init() 済みのプロジェクト上で実行することを想定しています
# 新規プロジェクトでは renv::init() を先に実行してください
cat("=== renv::status() でロックファイルとの同期状態を確認 ===\n")
renv::status()
cat("\n")
# -----------------------------------------------
# キャラクターデータの作成(龍が如くシリーズ)
# -----------------------------------------------
# 龍が如くシリーズのメインキャラクター5名のデータです
characters <- data.frame(
name = c("桐生一馬", "真島吾朗", "澤村遥", "錦山彰", "伊達俊夫"),
role = c("主人公", "狂犬", "ヒロイン", "幼馴染", "刑事"),
heat_level = c(100L, 98L, 45L, 72L, 68L), # ヒートゲージの最大値(独自設定)
chapter = c(1L, 1L, 1L, 2L, 3L), # 初登場チャプター
stringsAsFactors = FALSE
)
cat("=== キャラクターデータ(data.frame)===\n")
print(characters)
cat("\n")
# -----------------------------------------------
# dplyr を使ったデータ操作(renv 管理下でインストール済み前提)
# -----------------------------------------------
# 以下は dplyr がインストールされている環境で動作します
# renv::install("dplyr") でインストール後に実行してください
if (requireNamespace("dplyr", quietly = TRUE)) {
library(dplyr)
cat("--- dplyr::filter() : ヒートゲージ 70 以上のキャラクターを絞り込みます ---\n")
high_heat <- dplyr::filter(characters, heat_level >= 70)
print(high_heat)
cat("\n")
cat("--- dplyr::arrange() : ヒートゲージの降順に並べ替えます ---\n")
sorted_chars <- dplyr::arrange(characters, desc(heat_level))
print(sorted_chars)
cat("\n")
cat("--- dplyr::mutate() : ヒートゲージをパーセント表示に変換します ---\n")
chars_pct <- dplyr::mutate(
characters,
heat_pct = paste0(heat_level, "%") # 数値に "%" を付けた文字列列を追加します
)
print(chars_pct[, c("name", "heat_level", "heat_pct")])
cat("\n")
} else {
cat("dplyr が見つかりません。renv::install(\"dplyr\") でインストールしてください。\n\n")
}
# -----------------------------------------------
# renv::dependencies() でスクリプトの依存パッケージを自動検出します
# -----------------------------------------------
cat("=== renv::dependencies() でこのスクリプトの依存パッケージを確認 ===\n")
deps <- renv::dependencies(path = "renv_packrat.R", quiet = TRUE)
if (nrow(deps) > 0) {
cat("検出された依存パッケージ:\n")
print(deps[, c("Package", "Version", "Source")])
} else {
cat("依存パッケージは検出されませんでした。\n")
}
cat("\n")
# -----------------------------------------------
# renv::snapshot() でロックファイルを更新します
# -----------------------------------------------
cat("=== renv::snapshot() でロックファイルを更新 ===\n")
cat("(新しいパッケージをインストールした後に実行することで renv.lock が更新されます)\n")
# 実際に snapshot を取りたい場合は以下のコメントを外してください
# renv::snapshot()
cat("renv.lock の更新は手動で renv::snapshot() を呼び出してください。\n\n")
# -----------------------------------------------
# renv::restore() の使い方(他の環境での再現手順)
# -----------------------------------------------
cat("=== 他の環境での再現手順(renv::restore())===\n")
cat("1. git clone でリポジトリを取得します\n")
cat("2. R を起動します(.Rprofile が renv を自動有効化します)\n")
cat("3. renv::restore() を実行すると renv.lock の通りに環境が再現されます\n\n")
# -----------------------------------------------
# キャラクター別サマリー出力
# -----------------------------------------------
cat("=== 龍が如く キャラクターサマリー ===\n")
cat(sprintf("登録キャラクター数 : %d名\n", nrow(characters)))
cat(sprintf("最高ヒートゲージ : %s(%d)\n",
characters$name[which.max(characters$heat_level)],
max(characters$heat_level)
))
cat(sprintf("平均ヒートゲージ : %.1f\n", mean(characters$heat_level)))
cat(sprintf("最も早い初登場 : %s(チャプター%d)\n",
paste(characters$name[characters$chapter == min(characters$chapter)], collapse = "・"),
min(characters$chapter)
))
Rscript renv_packrat.R
=== renv バージョン確認 ===
renv version: 1.0.3
=== renv::status() でロックファイルとの同期状態を確認 ===
The project is already synchronized with the lockfile.
=== キャラクターデータ(data.frame)===
name role heat_level chapter
1 桐生一馬 主人公 100 1
2 真島吾朗 狂犬 98 1
3 澤村遥 ヒロイン 45 1
4 錦山彰 幼馴染 72 2
5 伊達俊夫 刑事 68 3
--- dplyr::filter() : ヒートゲージ 70 以上のキャラクターを絞り込みます ---
name role heat_level chapter
1 桐生一馬 主人公 100 1
2 真島吾朗 狂犬 98 1
3 錦山彰 幼馴染 72 2
--- dplyr::arrange() : ヒートゲージの降順に並べ替えます ---
name role heat_level chapter
1 桐生一馬 主人公 100 1
2 真島吾朗 狂犬 98 1
3 錦山彰 幼馴染 72 2
4 伊達俊夫 刑事 68 3
5 澤村遥 ヒロイン 45 1
--- dplyr::mutate() : ヒートゲージをパーセント表示に変換します ---
name heat_level heat_pct
1 桐生一馬 100 100%
2 真島吾朗 98 98%
3 澤村遥 45 45%
4 錦山彰 72 72%
5 伊達俊夫 68 68%
=== renv::dependencies() でこのスクリプトの依存パッケージを確認 ===
検出された依存パッケージ:
Package Version Source
1 renv NA <NA>
2 dplyr NA <NA>
=== renv::snapshot() でロックファイルを更新 ===
(新しいパッケージをインストールした後に実行することで renv.lock が更新されます)
renv.lock の更新は手動で renv::snapshot() を呼び出してください。
=== 他の環境での再現手順(renv::restore())===
1. git clone でリポジトリを取得します
2. R を起動します(.Rprofile が renv を自動有効化します)
3. renv::restore() を実行すると renv.lock の通りに環境が再現されます
=== 龍が如く キャラクターサマリー ===
登録キャラクター数 : 5名
最高ヒートゲージ : 桐生一馬(100)
平均ヒートゲージ : 76.6
最も早い初登場 : 桐生一馬・真島吾朗・澤村遥(チャプター1)
よくあるミス
ミス1: renv::restore() で依存関係の競合が発生する
複数のパッケージが同じパッケージの異なるバージョンを要求している場合、renv::restore() が依存関係の競合を検出してエラーを出すことがある。renv::status() で事前に差分を確認し、必要に応じて renv.lock の内容を手動で調整するか、競合しているパッケージのバージョンを揃える。
renv_conflict.R
# renv::restore() を実行したときの競合エラーの例
# renv.lock で dplyr 1.0.0 が指定されているが、
# 別のパッケージが dplyr >= 1.1.0 を要求している場合
renv::restore()
# Error: package 'dplyr' [1.0.0] is not compatible with package 'xxx' which requires dplyr >= 1.1.0
# 競合の詳細を確認する
renv::status()
# 解消策: ロックファイルのバージョン指定を更新して再スナップショットを取る
# renv::install("dplyr@1.1.0")
# renv::snapshot()
The following packages are out of sync:
Package Lockfile Library
dplyr 1.0.0 1.1.4
Use `renv::snapshot()` to update the lockfile.
ミス2: Packrat 環境でパッケージが見つからないエラーが出る
Packrat(renv の前身ツール)を使ったプロジェクトを renv に移行する際、packrat/ ディレクトリが残ったままだと renv が正しく機能しないことがある。Packrat から renv への移行は renv::migrate() を使う。移行後は renv::status() で環境が正しく認識されているか確認する。
renv_migrate.R
# Packrat から renv への移行手順 # 1. プロジェクトを renv で初期化する renv::init() # 2. Packrat からパッケージ情報を移行する renv::migrate() # 3. 環境の同期状態を確認する renv::status() # 4. 問題なければスナップショットを更新する # renv::snapshot()
* Migrating project from Packrat to renv ... * Initialized empty project. The project is already synchronized with the lockfile.
概要
『R』の renv パッケージはプロジェクト単位でパッケージバージョンを固定する環境管理ツールです。renv::init() を実行するとプロジェクトルートに renv/ ディレクトリと renv.lock が生成され、以降のパッケージ操作はグローバルライブラリではなくプロジェクト専用のライブラリパスに対して行われます。renv::snapshot() で現在の状態をロックファイルに記録し、renv::restore() でその状態を他の環境に完全再現できるため、チーム開発や論文・分析の再現性確保に非常に有効です。renv::status() でロックファイルと現在の環境の差分を随時確認でき、renv::dependencies() でスクリプトが必要とするパッケージを自動検出できます。パッケージのインストールには renv::install() を使い、バージョン指定("dplyr@1.1.0")や GitHub インストール("tidyverse/dplyr")も同じ関数で行えます。パッケージのインストール・更新・削除操作については パッケージのインストールと管理 も合わせて確認できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。