renv on Databricks

renv は、ユーザーがノートブックに固有の R 依存関係を管理できるようにする R パッケージです。

renvを使用すると、プロジェクトの R ライブラリ環境を作成および管理し、これらのライブラリの状態を lockfileに保存し、後で必要に応じてライブラリを復元できます。これらのツールを組み合わせることで、プロジェクトの分離性、移植性、再現性を高めることができます。

基本的な renv ワークフロー

renvのインストール

renv は、 クラスター スコープのライブラリ または ノートブック スコープのライブラリとしてインストールできます。renv をノートブック スコープのライブラリとしてインストールするには、次を使用します。

require(devtools)

install_version(
  package = "renv",
  repos   = "http://cran.us.r-project.org"
)

Databricks では、 パッケージのバージョンを修正するために、リポジトリとして CRAN スナップショットを使用することをお勧めします。

プレインストールされた R ライブラリを使用して renv セッションを初期化する

renv を使用する場合の最初のステップは、 renv::init()を使用してセッションを初期化することです。既定のダウンロード場所を R ノートブック スコープのライブラリ パスに変更するには、 libPaths を設定します。

renv::init(settings = list(external.libraries=.libPaths()))
.libPaths(c(.libPaths()[2], .libPaths())

renv を使用して追加のパッケージをインストールする

renvの API を使用して、R パッケージをインストールおよび削除できるようになりました。たとえば、最新バージョンの digestをインストールするには、ノートブック セル内で次のコマンドを実行します。

renv::install("digest")

古いバージョンの digestをインストールするには、ノートブックセル内で次のコマンドを実行します。

renv::install("digest@0.6.18")

GitHub から digest をインストールするには、ノートブック セル内で次のコマンドを実行します。

renv::install("eddelbuettel/digest")

Bioconductor からパッケージをインストールするには、ノートブック セル内で次のコマンドを実行します。

# (note: requires the BiocManager package)
renv::install("bioc::Biobase")

renv::install API は renv キャッシュを使用することに注意してください。

renv を使用して R ノートブック環境を DBFS に保存する

環境を保存する前に、次のコマンドを一度実行します。

renv::settings$snapshot.type("all")

これにより、ノートブックで現在使用されているパッケージだけでなく、 libPathsにインストールされているすべてのパッケージのスナップショットを作成する renv が設定されます。詳細については、 renv のドキュメント を参照してください。

これで、ノートブックセル内で以下を実行して、環境の現在の状態を保存できます。

renv::snapshot(lockfile="/dbfs/PATH/TO/WHERE/YOU/WANT/TO/SAVE/renv.lock", force=TRUE)

これにより、 libPathsにインストールされているすべてのパッケージをキャプチャして lockfile を更新します。また、 lockfile をローカルファイルシステムから DBFSに移動し、クラスターが終了または再起動しても保持されます。

DBFS からの lockfile を指定して renv 環境を再インストールする

まず、新しいクラスターで、 renv 環境を最初に作成したものと同じバージョンの Databricks Runtime が実行されていることを確認します。 これにより、プレインストールされている R パッケージが同一になります。 これらのリストは、各ランタイムの リリースノートにあります。 renv をインストールしたら、ノートブック セル内で次のコマンドを実行します。

renv::init(settings = list(external.libraries=.libPaths()))
.libPaths(c(.libPaths()[2], .libPaths()))
renv::restore(lockfile="/dbfs/PATH/TO/WHERE/YOU/SAVED/renv.lock", exclude=c("Rserve", "SparkR"))

これにより、 lockfile が DBFS からローカル ファイル システムにコピーされ、 lockfileで指定されたパッケージが復元されます。

リポジトリの欠落エラーを回避するには、パッケージの復元から Rserve パッケージと SparkR パッケージを除外します。 これらのパッケージは両方とも、すべてのランタイムにプリインストールされています。

renv キャッシュ

renv の非常に便利な機能は、クラスター上のすべての renv プロジェクトで共有される グローバルパッケージキャッシュです。インストール時間を短縮し、ディスクスペースを節約します。 renv キャッシュは、 devtools API を介してダウンロードされたパッケージをキャッシュしないか、 pkgs以外の追加の引数を持つ install.packages() をキャッシュしません。