再現可能な科学分析に最適な R ツール
再現可能な科学分析のためのRは、4つの層に依存している。プロジェクト構造、バージョン管理された環境、文書化された文書形式、そして依存関係マネージャーである。Rエコシステムは、最後の2つの層に対して少なくとも6つの成熟した選択肢を提供している。renv、targets、Quarto、R Markdown、rockerイメージを用いたDocker、そしてworkflowrである。また、Software CarpentryのR for Reproducible Scientific Analysisレッスンは、2014年からこのスタックを教え続けている。
主なポイント
- 再現可能な科学分析のためのRにおける再現性は、単一のツールではなくスタックである。プロジェクトレイアウト + 依存関係の固定 + 文書化されたレポーティング + ワークフロー自動化。
renv(CRAN、初回リリース2020年)は、プロジェクトごとのパッケージライブラリのデファクトスタンダードである。正確なバージョンをrenv.lockに記録する。targetsは、アドホックなsource()スクリプトを、最新のステップをスキップして結果をキャッシュする依存関係グラフに置き換える。- Quarto(Posit、2022年)は、新規プロジェクトにおいてR Markdownをほぼ置き換えたが、R Markdownは完全にサポートされ続けており、教育現場で広く使われている。
- コンテナ(rocker/verse、Bioconductorイメージ)は、
renvが到達できないシステム層を固定する。R自体、システムライブラリ、コンパイル済み依存関係である。 - Software Carpentryのレッスンは、依然として最高の無料の入門手段である。プロジェクトレイアウト、
knitr、ggplot2を2日間の単一カリキュラムで教えている。
Rにおいて「再現可能」とは実際に何を要求するか
Rにおける再現性とは、別の人物が、別のマシンで、後の日付に、あなたの分析を再実行し、同じ数値と図を得られることを意味する。4つの失敗モードがその保証を破り、それぞれが特定のクラスのツールに対応する。
環境のドリフト。 あなたのスクリプトはlibrary(dplyr)を呼び出し、今日は動作する。6か月後、CRANの更新がデフォルト引数を変更し、あなたのパイプラインは気づかないうちに異なる出力を生成する。修正方法は、プロジェクトごとにパッケージバージョンを固定することであり、‘renv’はロックファイルを書き込むことでこれを行う。
隠れた状態。 あなたのスクリプトは、作業ディレクトリ、読み込まれた.RDataファイル、または1時間前にインタラクティブに定義した変数を前提としている。修正方法は、作業ディレクトリが常にプロジェクトルートであり、セッション状態が漏れ込まないプロジェクト指向のワークフローである。
手動ステップ。 スクリプト1を実行し、次にスクリプト2を実行し、次にCSVを手で編集し、次にスクリプト3を実行する。修正方法は、依存関係グラフをエンコードし、変更されたものだけを再実行するワークフローツールである。
システム層のドリフト。 あなたの分析は、特定のBLAS実装、コンパイル済みC++ライブラリ、またはBioconductorバージョンに依存している。パッチは、オペレーティングシステム、Rバイナリ、システムライブラリを一緒に凍結するコンテナイメージである。
関連: — ガイド付きターミナルと実際のデータセットを使用したプロジェクトベースのデータ サイエンス パス.
公開されている「再現可能な」R分析のほとんどは、最初の2つだけに焦点を当てている。以下のツールは、それらがカバーする残りの領域に基づいて分類されている。
比較:6つのツール、スコープ別ランキング
| ツール | 固定する層 | 学習曲線 | 最適な用途 | 弱点 |
|---|---|---|---|---|
renv | Rパッケージバージョン | 低 | すべてのプロジェクト、常に | R自体やシステムライブラリを固定できない |
targets | パイプラインステップ + キャッシュされた出力 | 中 | 多段階分析、長時間実行 | 単一スクリプト作業には過剰 |
| Quarto | 文書 + コード + 出力 | 低〜中 | 論文、レポート、スライドを1つのソースから | 依存関係マネージャーではない |
| R Markdown | 文書 + コード + 出力 | 低 | 教育、レガシープロジェクト | 新規作業ではQuartoに取って代わられた |
| Docker + rocker | OS、Rバイナリ、システムライブラリ | 高 | HPC、アーカイブ、機関間共有 | 重い。コンテナリテラシーが必要 |
| workflowr | プロジェクト + バージョン管理されたサイト | 中 | ウェブサイトとして公開されるラボノート | 意見の強いレイアウト。コミュニティが小さい |
再現可能な科学分析のためにRを使用する計算物理学やバイオインフォマティクスのグループへの実践的な推奨:すべてのプロジェクトでrenvとQuartoを使用し、パイプラインが約3つの依存ステージを超えたらtargetsを追加し、分析を機関外の誰かに引き渡す必要がある場合、または論文のためにアーカイブする場合にのみコンテナ化する。
renv:パッケージ層の固定
renvはPackratの後継であり、Kevin Usheyによって開発され、Positによって維持されている。renv/library/の下にプロジェクトローカルのライブラリを作成し、すべてのパッケージバージョンをプレーンテキストのrenv.lockファイルに記録する。共同作業者はあなたのリポジトリをクローンし、renv::restore()を実行すると、バイト単位で同一のパッケージバージョンを得る — Bioconductorパッケージも含めて、renvはロックファイルに記録されたBioconductorリリースに対して解決する。
一見の価値があります: — 大学が支援する Python およびデータサイエンス証明書の 1 つのサブスクリプション.
実践において2つの詳細が重要である。第一に、renv::snapshot()は使用されていると検出できるパッケージのみを記録する。関数内でrequire()を介して動的にパッケージを読み込む場合、または文字列内でのみ参照されるパッケージにlibrary()を使用する場合は、renv::snapshot(type = "all")で明示的に追加するか、プロジェクトのDESCRIPTIONにリストする。第二に、renvはRバージョン自体を固定しない — 使用したRバージョンを保存し、renv::restore()は不一致がある場合に警告するが、そのRバージョンをあなたのためにインストールすることはない。このためには、再現可能な科学分析のためのRを保証するコンテナ層が必要である。
したがって、最小限の再現可能なプロジェクトは次のようになる:
my-analysis/
├── renv.lock
├── renv/
├── R/
│ ├── 01-load.R
│ └── 02-model.R
├── data/
├── report.qmd
└── README.md
README.mdには、Rバージョン、依存関係を復元するコマンド、レポートをビルドするコマンドを記載すべきである。3行のドキュメントが、ほとんどの「私のマシンでは動作しない」というメールを防ぐ。
targets:依存関係グラフのエンコード
Will Landauによる「targets」は、パイプラインを名前付きターゲットの有向非巡回グラフに変換する。各ターゲットは宣言された入力を持つ関数呼び出しであり、targetsは入力をハッシュ化し、次回の実行では入力とコードが変更されていないターゲットを無視する。トラジェクトリの分析に20分かかる分子動力学の後処理パイプラインにとって、これは秒単位の反復と30分単位の反復の違いである。
メンタルシフトは「順番に実行されるスクリプト」から「必要なものを宣言する関数」への転換である。_targets.Rファイルがグラフを定義する:
library(targets)
list(
tar_target(raw_files, list.files("data", full.names = TRUE)),
tar_target(parsed, parse_trajectory(raw_files), pattern = map(raw_files)),
tar_target(summary_stats, summarize(parsed)),
tar_target(report, render_report(summary_stats), format = "file")
)
pattern = map(...)構文は「動的ブランチング」機能である。入力ファイルごとに1つのサブターゲットを作成し、tar_make_future()またはtar_make_clustermq()でそれらを並列化する。HPCクラスタ上では、これは自然にタスクテーブルに対応する。
注意点:「targets」は積極的にキャッシュし、乱数シードや壁時計時間に依存するターゲットは、シードをターゲット内で定義し時間を明示的な引数として渡さない限り、常に無効化される。非決定性は厄介事ではなく、グラフのバグとして扱うこと。
QuartoとR Markdown:文書化されたレポーティング
QuartoはPositの次世代パブリッシングシステムであり、2022年にリリースされ、同じ文書内でR、Python、Julia、Observableコードを実行する。R中心のグループにとって、R Markdownに対する3つの具体的な利点を提供する:フォーマット固有のYAMLの技巧なしにPDF、HTML、Word、スライドにレンダリングする単一の.qmd形式。図、表、方程式への相互参照のネイティブサポート。そして、文書のディレクトリからラボのウェブサイト全体や書籍をビルドできるプロジェクトレベルの_quarto.ymlである。
R Markdownは死んでいない。その下のknitrエンジンはQuartoが使用するものと同じであり、Software CarpentryのR for Reproducible Scientific Analysisレッスン — 世界で最も広く教えられているRカリキュラム — は完全にR Markdownで構築されている。学習するなら、knitrの概念(チャンク、チャンクオプション、cache=TRUE、fig.width)を学ぶこと。それらは直接Quartoに移行する。
文書化された文書の再現性の利点は、散文とコードが逸脱できないことである。要旨で引用される数値は、手入力の値ではなくインラインコードの一部である。データが更新されると、数値も更新される。この独自の実践は、計算論文における撤回に隣接する最も一般的なエラーカテゴリを排除する。
コンテナ:システム層の固定
パッケージを固定するrenvは、Cコンパイラ、HDF5ライブラリバージョン、またはNumPyとRの両方がリンクされるBLASを固定しない。コンパイル済みコードに依存する分析 — Rcppパッケージ、地理空間作業のためのsf、C依存関係を持つBioconductorパッケージ — にとって、コンテナが唯一の完全な答えである。
rockerプロジェクト(GitHubのrocker-org、Dirk EddelbuettelとCarl Boettigerによって維持)は公式のR Dockerイメージを公開している。rocker/r-verは特定のRバージョンを固定し、rocker/verseはTidyverse、開発ツール、パブリッシングツールを追加し、「rocker/bioconductor」はBioconductorリリースに従う。rocker/r-ver:4.4.1から始めてrenv::restore()を実行するDockerfileは、カーネルからパッケージまで完全に固定されたスタックを提供する。
正直な妥協:コンテナはビルドステップ、レジストリ、そして多くのラボメンバーが学んでいない語彙を追加する。機関のクラスタ上の2人プロジェクトでは、「renv」と文書化されたRバージョンで通常は十分である。外部共同研究者との論文では、コンテナは次の3年間のシステムアップグレードを生き残る成果物である。
決定方法:基準チェックリスト
順番に確認し、最初の「はい」で停止する。
- ラボ外の誰かがこれを実行するか? もしそうなら、最初からコンテナを計画する。後付けは構築よりも難しい。
- パイプラインに3つ以上の依存ステージがあるか、または5分以上かかるステージが1つあるか? もしそうなら、再現可能な科学分析のために
targetsを使用する。 - 出力に人間が読む文書、図、または表が含まれるか? もしそうなら、Quarto(またはグループに既にテンプレートがある場合はR Markdown)を使用する。
- 分析がコンパイル済みパッケージまたは特定のBioconductorリリースに依存しているか? もしそうなら、rockerベースのコンテナを追加する。
- これは単一の図を生成する単一のスクリプトか?
renvとプロジェクトファイルを使用し、そこで停止する。一回限りの分析を過剰に設計することは、節約するよりも多くの時間を浪費する。
時間をかける価値のある学習リソース
Software CarpentryのレッスンR for Reproducible Scientific Analysis(swcarpentry.github.io/r-novice-gapminder)は、依然として標準的な無料の入門である。プロジェクトレイアウト、データ構造、ggplot2、dplyr、knitrを、ライブインストラクターとの2日間ワークショップ向けに設計された形式でカバーしている。レッスンのGitHubリポジトリは貢献を受け付けており、Rリリースに合わせて最新の状態を保っている。
ツール層については、公式ドキュメントが非常に優れている:renvの入門ビネット、targetsマニュアル(HPCユーザー向けのウォークスルーを含む)、Quartoドキュメントの「Computations」章である。CRANのReproducible Research Task Viewは、この分野のすべてのパッケージの維持されたインデックスであり、新しいものを採用する前に確認すべき適切な場所である。
概念的背景については、National AcademiesのReproducibility and Replicability in Scienceコンセンサス研究(2019年)が語彙を正確に定義しており、助成金申請で引用する価値がある。データ管理のためのFAIR Guiding Principlesは、出力をどのように公開すべきかについて補完的な枠組みを提供する。
出典とさらなる読み物
- Scientific method — Wikipedia: 科学的方法とは、注意深い観察、厳密な懐疑主義、仮説検証、実験的検証を通じて知識を獲得するための経験的方法である…
よくある質問
再現可能な分析に最適なRパッケージは何ですか?
renvは、共同作業者が復元できるロックファイルにプロジェクトごとの正確なパッケージバージョンを固定するため、再現可能なR分析のための単一の最も重要なパッケージである。文書化された文書ツール(QuartoまたはR Markdown)と、多段階パイプラインの場合はtargetsと組み合わせる必要がある。単一のパッケージが再現性の4つの層すべてをカバーするわけではないため、答えは単一のツールではなく小さなスタックである。
再現可能な研究にはR MarkdownとQuartoのどちらが良いですか?
Quartoは新規プロジェクトにとってより良い選択である:1つのソースからより多くの形式にレンダリングし、相互参照をネイティブにサポートし、同じ文書内でR、Python、Juliaで動作する。R Markdownは完全にサポートされ続けており、Software Carpentryカリキュラムで使用されている形式であるため、既存の教材やテンプレートは時代遅れではない。どちらも同じknitr実行エンジンを使用するため、スキルは直接移行する。
別のマシンでR分析を再現可能にするにはどうすればよいですか?
READMEにRバージョンを記録し、renv.lockファイルをコミットし、共同作業者にスクリプトを開く前にrenv::restore()を実行するよう指示する。絶対パスとsetwd()呼び出しを避け、プロジェクト相対パスまたはhereパッケージを使用する。分析がコンパイル済みパッケージまたは特定のBioconductorリリースに依存している場合は、システム層も固定されるようにrockerイメージに基づくDockerfileを提供する。
renv は Bioconductor パッケージで動作しますか?
はい。 renv は Bioconductor パッケージを検出し、Bioconductor リリース バージョンをパッケージ バージョンとともにロック ファイルに保存します。 renv::restore() は、CRAN からではなく、対応する Bioconductor リリースからインストールされ、バイオインフォマティクス パイプラインを破壊するバージョンの不整合を防ぎます。 CRAN パッケージと Bioconductor パッケージを混合している場合は、snapshot()の後のロック ファイルをチェックして、両方のソースが記録されていることを確認してください。
R パイプラインのターゲットと Makefile の違いは何ですか?
targets は R ネイティブです。ターゲットは R オブジェクトであり、依存関係グラフは関数の引数から推論され、結果は R 読み取り可能なストアにキャッシュされます。 Makefile では、ファイル レベルの依存関係を手動で宣言する必要があり、オブジェクト レベルではなくファイル レベルで動作します。 targetsは動的分岐もサポートしているため、1 つのターゲット定義を数百の入力ファイルにファンアウトして自動的に並列化できますが、これを Make で表現するのは厄介です。
HPC クラスターでの再現可能な分析に R を使用できますか?
はい。再現可能な科学分析に R を使用するための標準パターンは、クラスター バックエンド (tar_make_clustermq() または tar_make_future()) を備えた targets と、rocker/r-ver または Bioconductor イメージから構築されたコンテナー イメージです。ほとんどの HPC センターは Docker ではなく Apptainer または Singularity をサポートしているため、イメージをローカルで構築して変換します。 R バージョンをイメージに固定し、パッケージ バージョンを renv.lock に固定します。この 2 つを組み合わせることで、クラスターのアップグレード間でジョブを再現できるようになります。
よくある質問
再現可能な分析に最適な R パッケージは何ですか?
renv は、共同作業者が復元できるロック ファイルにプロジェクトごとの正確なパッケージ バージョンを固定するため、再現可能な R 分析にとって最も重要なパッケージです。これは、読み書き可能なドキュメント ツール (Quarto または R Markdown)、およびマルチステージ パイプラインの場合はターゲットと組み合わせる必要があります。再現性の 4 つの層すべてを単一のパッケージでカバーすることはできないため、答えは単一のツールではなく小さなスタックです。
再現可能な研究には R Markdown と Quarto のどちらが優れていますか?
Quarto は、新しいプロジェクトに適した選択肢です。Quarto は、1 つのソースからより多くの形式にレンダリングし、相互参照をネイティブにサポートし、同じドキュメント内で R、Python、および Julia と連携します。 R Markdown は引き続き完全にサポートされており、依然として Software Carpentry カリキュラムで使用されている形式であるため、既存の教材やテンプレートが時代遅れになることはありません。どちらも同じ Knitr 実行エンジンを使用するため、スキルは直接継承されます。
R 分析を別のマシンで再現できるようにするにはどうすればよいですか?
README に R バージョンを記録し、renv.lock ファイルをコミットし、スクリプトを開く前に renv::restore() を実行するように共同作業者に指示します。絶対パスと setwd() 呼び出しは避けてください。プロジェクトの相対パスまたは here パッケージを使用します。分析がコンパイル済みパッケージまたは特定の Bioconductor リリースに依存している場合は、ロッカー イメージに基づく Dockerfile を提供して、システム層も固定されるようにします。
renv は Bioconductor パッケージで動作しますか?
はい。 renv は Bioconductor パッケージを検出し、Bioconductor リリース バージョンをパッケージ バージョンとともにロック ファイルに保存します。 renv::restore() は、CRAN からではなく、対応する Bioconductor リリースからインストールされ、バイオインフォマティクス パイプラインを中断するバージョンの偏りを防ぎます。 CRAN パッケージと Bioconductor パッケージを混合している場合は、snapshot() の後にロック ファイルをチェックして、両方のソースが記録されていることを確認します。
R パイプラインのターゲットと Makefile の違いは何ですか?
ターゲットは R ネイティブです。ターゲットは R オブジェクトであり、依存関係グラフは関数の引数から推論され、結果は R 読み取り可能なストアにキャッシュされます。 Makefile では、ファイル レベルの依存関係を手動で宣言する必要があり、オブジェクト レベルではなくファイル レベルで動作します。ターゲットは動的分岐もサポートしているため、1 つのターゲット定義が数百の入力ファイルにわたって展開され、自動的に並列化されますが、これを Make で表現するのは困難です。
HPC クラスターでの再現可能な分析に R を使用できますか?
はい。再現可能な科学分析に R を使用する標準パターンは、クラスター バックエンド (tar_make_clustermq() または tar_make_future()) と、rocker/r-ver または Bioconductor イメージから構築されたコンテナー イメージを備えたターゲットです。ほとんどの HPC センターは Docker ではなく Apptainer または Singularity をサポートしているため、イメージをローカルで構築して変換します。 R バージョンをイメージに固定し、パッケージ バージョンをrenv.lockに固定します。この 2 つを組み合わせることで、クラスターのアップグレード間でジョブを再現できるようになります。
ブラウザでコーディングして Python を学習する
ブラウザーで直接コーディングするインタラクティブな Python およびデータ サイエンス コース