Reproducibility & Workflow
Also: rig for R versions, Docker (rocker images: rocker/r-ver, rocker/tidyverse), Posit Package Manager snapshots, rix/Nix for fully reproducible environments.
45.1 Projects & paths
One RStudio Project (or Positron folder) per analysis; never setwd() in scripts.
here::here("data", "raw.csv") for project-relative paths.
Suggested layout:
Restart R often (Ctrl+Shift+F10) and don't save the workspace (.RData).
project/
├── project.Rproj
├── data/raw/ # read-only original data
├── data/processed/
├── R/ # functions
├── analysis/ # scripts / .qmd files
├── output/figures/
├── renv.lock
└── README.md45.2 renv — package version management
Also: rig for R versions, Docker (rocker images: rocker/r-ver, rocker/tidyverse), Posit Package Manager snapshots, rix/Nix for fully reproducible environments.
renv::init() # create a project-local library + renv.lock
renv::install("dplyr")
renv::snapshot() # record versions in renv.lock
renv::restore() # recreate the environment elsewhere
renv::status(); renv::update()45.3 targets — pipeline toolkit (make-like)
# _targets.R
library(targets)
tar_option_set(packages = c("readr", "dplyr", "ggplot2"))
source("R/functions.R")
list(
tar_target(raw_file, "data/raw.csv", format = "file"),
tar_target(raw, read_csv(raw_file)),
tar_target(clean, clean_data(raw)),
tar_target(model, fit_model(clean)),
tar_target(plot, make_plot(clean)),
tar_quarto(report, "report.qmd")
)tar_make() # run only outdated steps
tar_visnetwork() # dependency graph
tar_read(model)45.4 Version control
Use Git + GitHub/GitLab (RStudio Git pane, usethis::use_git(), gert). Commit code and small data, not outputs or secrets; add .Rhistory, .RData, .Renviron to .gitignore.
45.5 Configuration & secrets
.Renviron (environment variables), config package (config.yml per environment), keyring for credentials.
45.6 Scheduling & automation
cronR/taskscheduleR, GitHub Actions (r-lib/actions), Posit Connect scheduled reports, targets + crew on HPC/cloud.