renv は、[[Posit]] が開発する [[R]] のパッケージマネージャーである。プロジェクトごとに依存パッケージを隔離して管理し、`renv.lock` にバージョンを記録することで、別の環境でも同じパッケージ構成を復元できる。
2019 年に公開された。同社の旧パッケージ管理ツール packrat の後継として、依存解決の高速化やキャッシュ共有を取り入れた設計になっている。[[Python]] の virtualenv や uv に近い役割を持ち、R プロジェクトの依存管理で広く使われている。
## セットアップ
### インストール
R にグローバルパッケージとしてインストールする。
```r
> install.packages("renv")
```
### プロジェクトの初期化
プロジェクトディレクトリで Positron を開き、コンソールで `renv::init()` を実行すると、`renv/` と `.Rprofile` が生成される。以後そのプロジェクトでは自動で renv 環境が有効化される。
```r
> renv::init()
```
> [!note]
> デフォルト (`bare = FALSE`) では既存ファイルをスキャンして `library()` 呼び出しから依存を自動推測する。
>
> 新規プロジェクトで初期状態を明示したい場合や、[[Quarto]] の R チャンク内の取りこぼしを避けたい場合は `bare = TRUE` を指定すると、空の renv 環境から始められる。
## パッケージの管理
### 追加
`renv::install()` で renv 環境にパッケージを追加する。
```r
> renv::install("tidyverse")
```
複数パッケージを一度に追加するときは文字ベクトルを渡す。
```r
> renv::install(c("tidyverse", "knitr", "rmarkdown"))
```
> [!note]
> renv 環境がアクティブなときは、`install.packages()` でも同じ renv 環境にインストールされる (`.libPaths()` の先頭が `renv/library/` に切り替わるため)。
>
> `renv::install()` は `pak` バックエンドで高速・GitHub などの追加ソースも統一記法で扱える点が利点。
### 削除
`renv::remove()` で renv 環境からパッケージを削除する。
```r
> renv::remove("tidyverse")
```
## 環境の記録と復元
### lockfile の更新
`renv::snapshot()` で現在の依存パッケージを `renv.lock` に書き出す。`renv::install()` や `renv::remove()` で環境に変更を加えたあと、`renv.lock` に反映するときに実行する。
```r
> renv::snapshot()
```
### 環境の復元
別環境で `renv::restore()` を実行すると、`renv.lock` に記録されたバージョンで依存パッケージが再現される。
```r
> renv::restore()
```
## 関連ノート
- **[応用]** [[rpj コマンドで R + Quarto + renv の分析プロジェクトを Positron で立ち上げる]]: `renv::init(bare = TRUE)` と `renv::install()` を新規プロジェクト初期化に組み込んだ実装例