Aller au contenu principal
ActivePapers Stockez vos données sous forme de documents recalculables : tout résultat publié peut ainsi être relancé, vérifié et préservé.

Certains liens de ce site sont des liens d'affiliation : si vous effectuez un achat via ceux-ci, nous pouvons percevoir une commission sans frais supplémentaires pour vous. Cela n'influence jamais nos recommandations. Consultez notre divulgation d'affiliation pour plus de détails. Divulgation d'affiliation.

Meilleurs outils R pour une analyse scientifique reproductible

R pour une analyse scientifique reproductible repose sur quatre couches : une structure de projet, un environnement à version contrôlée, un format de document littéraire et un gestionnaire de dépendances. L’écosystème R propose au moins six options matures pour les deux dernières couches - renv, cibles, Quarto, R Markdown, Docker avec images rocker et workflowr - et la leçon Software Carpentry R for Reproductible Scientific Analysis enseigne cette pile depuis 2014.

Points clés à retenir

  • La reproductibilité dans R pour une analyse scientifique reproductible est une pile, pas un outil unique : présentation du projet + épinglage des dépendances + reporting littéraire + automatisation du flux de travail.
  • renv (CRAN, première version 2020) est le standard de facto pour les bibliothèques de packages par projet ; il enregistre les versions exactes dans renv.lock.
  • targets remplace les scripts ad hoc source() par un graphique de dépendances qui ignore les étapes à jour et met en cache les résultats.
  • Quarto (Posit, 2022) a largement remplacé R Markdown pour les nouveaux projets, mais R Markdown reste entièrement pris en charge et largement utilisé dans l’enseignement.
  • Les conteneurs (rocker/verse, images Bioconductor) épinglent la couche système que « renv » ne peut pas atteindre : R lui-même, les bibliothèques système et les dépendances compilées.
  • La leçon Software Carpentry reste la meilleure rampe d’accès gratuite ; il enseigne la mise en page de projets, « knitr » et « ggplot2 » dans un seul programme de deux jours.

Ce que “reproductible” nécessite réellement dans R

La reproductibilité dans R signifie qu’une deuxième personne, sur une deuxième machine, peut réexécuter votre analyse à une date ultérieure et obtenir les mêmes nombres et chiffres. Quatre modes de défaillance rompent cette garantie, et chacun correspond à une classe spécifique d’outils.

Dérive de l’environnement. Votre script appelle library(dplyr) et fonctionne aujourd’hui ; six mois plus tard, une mise à jour CRAN modifie un argument par défaut et votre pipeline produit silencieusement une sortie différente. Le correctif consiste à épingler les versions de package par projet, ce que « renv » fait en écrivant un fichier de verrouillage.

État caché. Votre script suppose un répertoire de travail, un fichier .RData chargé ou une variable que vous avez définie de manière interactive il y a une heure. Le correctif est un flux de travail orienté projet dans lequel le répertoire de travail est toujours la racine du projet et aucun état de session ne s’infiltre.

Étapes manuelles. Vous exécutez le script 1, puis le script 2, puis modifiez manuellement un CSV, puis exécutez le script 3. Le correctif est un outil de flux de travail qui encode le graphique de dépendances et réexécute uniquement ce qui a changé.

Dérive de la couche système. Votre analyse dépend d’une implémentation BLAS spécifique, d’une bibliothèque C++ compilée ou d’une version de Bioconductor. Le correctif est une image de conteneur qui fige ensemble le système d’exploitation, le binaire R et les bibliothèques système.

Connexes : — Cours interactifs Python et science des données que vous codez directement dans le navigateur.

La plupart des analyses R « reproductibles » publiées se concentrent uniquement sur les deux premiers. Les outils ci-dessous sont classés en fonction du domaine restant qu’ils couvrent.

La comparaison : six outils, classés par domaine d’application

OutilCouche épingléeCourbe d’apprentissageIdéal pourFaiblesse
renvVersions du package RFaibleChaque projet, toujoursImpossible d’épingler R lui-même ou les bibliothèques système
ciblesÉtapes du pipeline + sorties mises en cacheMoyenAnalyses en plusieurs étapes, longues durées d’exécutionTrop complexe pour le travail à script unique
QuartoDocument + code + sortieFaible-moyenArticles, rapports, diapositives d’une seule sourcePas un gestionnaire de dépendances
R MarkdownDocument + code + sortieFaibleEnseignement, projets d’héritageRemplacé par Quarto pour un nouveau travail
Docker + basculeOS, binaire R, bibliothèques systèmeÉlevéHPC, archivage, partage inter-institutionsLourd; a besoin d’alphabétisation sur les conteneurs
flux de travailProjet + site versionnéMoyenCahiers de laboratoire publiés sous forme de sites WebStructure rigide ; petite communauté

La recommandation pratique pour un groupe de physique computationnelle ou de bioinformatique utilisant R pour une analyse scientifique reproductible : utilisez « renv » et Quarto sur chaque projet, ajoutez des « cibles » une fois qu’un pipeline a dépassé environ trois étapes dépendantes, et conteneurisez uniquement lorsque vous devez confier l’analyse à une personne extérieure à votre institution ou l’archiver pour un article.

renv : Épingler la couche de package

renv est le successeur de Packrat, développé par Kevin Ushey et maintenu par Posit. Il crée une bibliothèque locale du projet sous « renv/library/ » et enregistre chaque version de package dans un fichier « renv.lock » en texte brut. Un collaborateur clone votre référentiel, exécute renv::restore() et obtient des versions de packages identiques en octets, y compris les packages Bioconductor, que renv résout par rapport à la version Bioconductor enregistrée dans le fichier de verrouillage.

Coup de cœur des lecteurs : — Parcours de science des données basés sur des projets avec un terminal guidé et des ensembles de données réels.

Deux détails comptent en pratique. Premièrement, renv::snapshot() enregistre uniquement les packages qu’il peut détecter comme étant utilisés ; si vous chargez un package dynamiquement via require() dans une fonction ou utilisez library() sur un package référencé uniquement dans une chaîne, ajoutez-le explicitement avec renv::snapshot(type = "all") ou répertoriez-le dans la DESCRIPTION du projet.

Deuxièmement, renv n’épingle pas la version R elle-même — il enregistre la version R que vous avez utilisée et renv::restore() vous avertira en cas de non-concordance, mais il n’installera pas cette version R pour vous. Pour cela, vous avez besoin de la couche conteneur pour garantir R pour une analyse scientifique reproductible.

Un projet minimal reproductible ressemble donc à ceci :

mon-analyse/
├── renv.lock
├── renv/
├──R/
│ ├── 01-charge.R
│ └── 02-modèle.R
├── données/
├── rapport.qmd
└── LISEZMOI.md

Le README.md doit indiquer la version R, la commande pour restaurer les dépendances et la commande pour créer le rapport. Trois lignes de documentation empêchent la plupart des e-mails « il ne fonctionne pas sur ma machine ».

cibles : encodage du graphique de dépendances

« Targets », de Will Landau, transforme un pipeline en un graphe acyclique dirigé de cibles nommées. Chaque cible est un appel de fonction avec des entrées déclarées ; targets hache les entrées et lors de l’exécution suivante, il ignore toute cible dont les entrées et le code sont inchangés. Pour un pipeline de post-traitement de dynamique moléculaire qui prend vingt minutes pour analyser les trajectoires, c’est la différence entre une itération en secondes et une itération en demi-heures.

Le changement mental se fait de « scripts qui s’exécutent dans l’ordre » à des « fonctions qui déclarent ce dont elles ont besoin ». Un fichier _targets.R définit le graphique :

Connexes : — Achetez des cours individuels de Python scientifique, souvent avec des remises importantes.

library(targets)
liste (
  tar_target(raw_files, list.files("data", full.names = TRUE)),
  tar_target(analysé, parse_trajectory(raw_files), pattern = map(raw_files)),
  tar_target(summary_stats, summarize(parsed)),
  tar_target(rapport, render_report(summary_stats), format = "fichier")
)

La construction pattern = map(...) est la fonctionnalité de “branchement dynamique” : elle crée une sous-cible par fichier d’entrée et les parallélise avec tar_make_future() ou tar_make_clustermq(). Sur un cluster HPC, cela correspond naturellement à une table de tâches.

La mise en garde : les “cibles” sont mises en cache de manière agressive, et une cible qui dépend d’une heure de graine aléatoire ou d’une horloge murale sera constamment invalidée à moins que vous ne définissiez la graine à l’intérieur de la cible et que vous transmettiez l’heure comme argument explicite. Traitez le non-déterminisme comme un bug dans le graphique et non comme une nuisance.

Quarto et R Markdown : reporting littéraire

Quarto est le système de publication de nouvelle génération de Posit, sorti en 2022, et il exécute le code R, Python, Julia et Observable dans le même document. Pour un groupe centré sur R, il offre trois avantages concrets par rapport à R Markdown : un format unique « .qmd » qui s’affiche au format PDF, HTML, Word et slides sans gymnastique YAML spécifique au format ; prise en charge native des références croisées aux figures, tableaux et équations ; et un « _quarto.yml » au niveau du projet qui peut créer un site Web ou un livre de laboratoire complet à partir d’un répertoire de documents.

Notre sélection : — Une bibliothèque technique approfondie de livres, de vidéos et de formations en informatique scientifique.

R Markdown n’est pas mort. Le moteur « knitr » ci-dessous est le même que celui utilisé par Quarto, et la leçon Software Carpentry R pour Reproductible Scientific Analysis – le programme R le plus largement enseigné au monde – est entièrement construit sur R Markdown. Si vous êtes en train d’apprendre, apprenez les concepts knitr (morceaux, options de morceaux, cache=TRUE, fig.width) lorsqu’ils sont transférés directement vers Quarto.

L’avantage de la reproductibilité des documents littéraires est que la prose et le code ne peuvent pas dévier. Un nombre cité dans le résumé est un morceau de code en ligne, et non une valeur saisie manuellement. Lorsque les données sont mises à jour, le numéro est mis à jour. Cette pratique unique élimine la catégorie d’erreur la plus courante adjacente à la rétractation dans les documents informatiques.

Conteneurs : épingler la couche système

Épingler les packages renv ; il n’épingle pas le compilateur C, la version de la bibliothèque HDF5 ou le BLAS auquel NumPy et R sont liés. Pour les analyses qui dépendent du code compilé — packages Rcpp, sf pour les travaux géospatiaux, packages Bioconductor avec dépendances C — le conteneur est la seule réponse complète.

Le projet rocker (rocker-org sur GitHub, maintenu par Dirk Eddelbuettel et Carl Boettiger) publie des images officielles R Docker. rocker/r-ver épingle une version R spécifique ; rocker/verse ajoute Tidyverse, des outils de développement et des outils de publication ; « rocker/bioconductor » suit les versions de Bioconductor. Un Dockerfile qui commence à partir de rocker/r-ver:4.4.1 et exécute renv::restore() vous donne une pile entièrement épinglée du noyau au package.

Le compromis honnête : les conteneurs ajoutent une étape de construction, un registre et un vocabulaire que de nombreux membres du laboratoire n’ont pas appris. Pour un projet à deux sur le cluster d’une institution, « renv » plus une version R documentée sont généralement suffisants. Pour un article avec des collaborateurs externes, un conteneur est l’artefact qui survit aux trois prochaines années de mises à niveau du système.

Comment décider : une liste de contrôle des critères

Parcourez-les dans l’ordre et arrêtez-vous au premier « oui ».

  1. Est-ce que quelqu’un extérieur à votre laboratoire effectuera cette opération ? Si oui, prévoyez un conteneur dès le départ ; en moderniser un est plus difficile que le construire.
  2. Le pipeline comporte-t-il plus de trois étapes dépendantes, ou une étape dure plus de cinq minutes ? Si tel est le cas, utilisez des « cibles » pour une analyse scientifique reproductible.
  3. Le résultat inclut-il un document, une figure ou un tableau lu par l’homme ? Si tel est le cas, utilisez Quarto (ou R Markdown si votre groupe dispose déjà de modèles).
  4. L’analyse dépend-elle des packages compilés ou d’une version spécifique de Bioconductor ? Si oui, ajoutez un conteneur basé sur une bascule.
  5. Est-ce un script unique produisant une seule figure ? Utilisez renv et un fichier projet, et arrêtez-vous là. La sur-ingénierie d’une analyse ponctuelle fait perdre plus de temps qu’elle n’en fait gagner.

Des ressources d’apprentissage qui valent la peine

La leçon Software Carpentry R pour Reproductible Scientific Analysis (swcarpentry.github.io/r-novice-gapminder) reste l’introduction canonique gratuite. Il couvre la présentation du projet, les structures de données, « ggplot2 », « dplyr » et « knitr » dans un format conçu pour des ateliers de deux jours avec un instructeur en direct. Le référentiel GitHub de la leçon accepte les contributions, il reste donc à jour avec les versions R.

Pour la couche d’outillage, la documentation officielle est exceptionnellement bonne : la vignette d’introduction renv, le manuel targets (qui comprend une procédure pas à pas pour les utilisateurs HPC) et le chapitre « Calculs » de la documentation Quarto. La Vue des tâches de recherche reproductible sur CRAN est l’index maintenu de chaque package dans cet espace et constitue le bon endroit pour vérifier avant d’adopter quelque chose de nouveau.

Pour le contexte conceptuel, l’étude consensuelle des National Academies Reproductibility and Replicability in Science (2019) définit le vocabulaire avec précision et mérite d’être citée dans les demandes de subvention. Les Principes directeurs FAIR pour la gestion des données fournissent un cadre complémentaire sur la manière dont les résultats doivent être publiés.

Sources et lectures complémentaires

  • Méthode scientifique — Wikipédia : La méthode scientifique est une méthode empirique permettant d’acquérir des connaissances par une observation attentive, un scepticisme rigoureux, des tests d’hypothèses et une validation expérimentale…

Questions fréquemment posées

Quel est le meilleur package R pour une analyse reproductible ?

renv est le package le plus important pour une analyse R reproductible car il épingle les versions exactes du package par projet dans un fichier de verrouillage que les collaborateurs peuvent restaurer. Il doit être combiné avec un outil documentaire compétent (Quarto ou R Markdown) et, pour les pipelines multi-étapes, avec des « cibles ». Aucun package unique ne couvre les quatre niveaux de reproductibilité, la réponse est donc une petite pile plutôt qu’un seul outil.

R Markdown ou Quarto sont-ils meilleurs pour une recherche reproductible ?

Quarto est le meilleur choix pour les nouveaux projets : il effectue le rendu dans plusieurs formats à partir d’une seule source, prend en charge les références croisées de manière native et fonctionne avec R, Python et Julia dans le même document. R Markdown reste entièrement pris en charge et reste le format utilisé par le programme Software Carpentry, de sorte que le matériel pédagogique et les modèles existants ne sont pas obsolètes. Les deux utilisent le même moteur d’exécution « knitr », donc les compétences sont transférées directement.

Comment rendre mon analyse R reproductible sur une autre machine ?

Enregistrez la version R dans votre README, validez un fichier renv.lock et demandez aux collaborateurs d’exécuter renv::restore() avant d’ouvrir un script. Évitez les chemins absolus et les appels setwd() ; utilisez des chemins relatifs au projet ou le package here. Si votre analyse dépend de packages compilés ou d’une version spécifique de Bioconductor, fournissez un Dockerfile basé sur une image rocker afin que la couche système soit également épinglée.

Renv fonctionne-t-il avec les packages Bioconductor ?

Oui. renv détecte les packages Bioconductor et enregistre la version de Bioconductor dans le fichier de verrouillage à côté des versions des packages. renv::restore() installe ensuite les packages à partir de la version correspondante de Bioconductor plutôt qu’à partir de CRAN, empêchant ainsi le décalage de version qui interrompt les pipelines bioinformatiques. Si vous mélangez les packages CRAN et Bioconductor, vérifiez le fichier de verrouillage après snapshot() pour confirmer que les deux sources sont enregistrées.

Quelle est la différence entre les cibles et un Makefile pour les pipelines R ?

targets est R-natif : les cibles sont des objets R, le graphe de dépendances est déduit des arguments de la fonction et les résultats sont mis en cache dans un magasin lisible en R. Un Makefile vous oblige à déclarer manuellement les dépendances au niveau du fichier et fonctionne au niveau du fichier plutôt qu’au niveau de l’objet. targets prend également en charge le branchement dynamique, de sorte qu’une définition de cible peut s’étendre sur des centaines de fichiers d’entrée et se paralléliser automatiquement, ce qui est difficile à exprimer dans Make.

Puis-je utiliser R pour une analyse reproductible sur un cluster HPC ?

Oui, et le modèle standard pour utiliser R pour une analyse scientifique reproductible est targets avec un backend de cluster (tar_make_clustermq() ou tar_make_future()) plus une image de conteneur construite à partir de rocker/r-ver ou une image Bioconductor. La plupart des centres HPC prennent en charge Apptainer ou Singularity plutôt que Docker, alors créez l’image localement et convertissez-la. Épinglez la version R dans l’image et les versions des packages dans renv.lock ; les deux ensemble rendent le travail reproductible entre les mises à niveau du cluster.

Questions fréquentes

Quel est le meilleur package R pour une analyse reproductible ?

renv est le package le plus important pour une analyse R reproductible car il épingle les versions exactes du package par projet dans un fichier de verrouillage que les collaborateurs peuvent restaurer. Il doit être combiné avec un outil documentaire compétent (Quarto ou R Markdown) et, pour les pipelines multi-étapes, avec des cibles. Aucun package unique ne couvre les quatre niveaux de reproductibilité, la réponse est donc une petite pile plutôt qu'un seul outil.

R Markdown ou Quarto sont-ils meilleurs pour la recherche reproductible ?

Quarto est le meilleur choix pour les nouveaux projets : il effectue le rendu dans plusieurs formats à partir d'une seule source, prend en charge les références croisées de manière native et fonctionne avec R, Python et Julia dans le même document. R Markdown reste entièrement pris en charge et reste le format utilisé par le programme Software Carpentry, de sorte que le matériel pédagogique et les modèles existants ne sont pas obsolètes. Les deux utilisent le même moteur d’exécution knitr, donc les compétences sont transférées directement.

Comment rendre mon analyse R reproductible sur une autre machine ?

Enregistrez la version R dans votre README, validez un fichier renv.lock et demandez aux collaborateurs d'exécuter renv::restore() avant d'ouvrir un script. Évitez les chemins absolus et les appels setwd() ; utilisez les chemins relatifs au projet ou le package ici. Si votre analyse dépend de packages compilés ou d'une version spécifique de Bioconductor, fournissez un Dockerfile basé sur une image rocker afin que la couche système soit également épinglée.

Renv fonctionne-t-il avec les packages Bioconductor ?

Oui. renv détecte les packages Bioconductor et enregistre la version de Bioconductor dans le fichier de verrouillage à côté des versions du package. renv::restore() s'installe ensuite à partir de la version correspondante de Bioconductor plutôt qu'à partir de CRAN, empêchant ainsi le biais de version qui interrompt les pipelines bioinformatiques. Si vous mélangez les packages CRAN et Bioconductor, vérifiez le fichier de verrouillage après snapshot() pour confirmer que les deux sources sont enregistrées.

Quelle est la différence entre les cibles et un Makefile pour les pipelines R ?

Targets est R-native : les cibles sont des objets R, le graphe de dépendances est déduit des arguments de la fonction et les résultats sont mis en cache dans un magasin lisible en R. Un Makefile vous oblige à déclarer manuellement les dépendances au niveau du fichier et fonctionne au niveau du fichier plutôt qu'au niveau de l'objet. Targets prend également en charge le branchement dynamique, de sorte qu'une définition de cible peut s'étendre sur des centaines de fichiers d'entrée et se paralléliser automatiquement, ce qui est difficile à exprimer dans Make.

Puis-je utiliser R pour une analyse reproductible sur un cluster HPC ?

Oui, et le modèle standard pour utiliser R pour une analyse scientifique reproductible est constitué de cibles avec un backend de cluster (tar_make_clustermq() ou tar_make_future()) plus une image de conteneur construite à partir de rocker/r-ver ou d'une image Bioconductor. La plupart des centres HPC prennent en charge Apptainer ou Singularity plutôt que Docker, alors créez l'image localement et convertissez-la. Épinglez la version R dans l'image et les versions du package dans renv.lock ; les deux ensemble rendent le travail reproductible entre les mises à niveau du cluster.


L'étagère de référence pour les scientifiques en activité

Une bibliothèque technique approfondie de livres, de vidéos et de formations en informatique scientifique