Introduction
R Markdown is an authoring framework from Posit (formerly RStudio) that lets analysts write documents combining prose, code, and results in a single file. When rendered, code chunks execute and their output (tables, plots, values) is woven into the final document. It is the standard approach for reproducible reporting in the R community.
What R Markdown Does
- Embeds executable R, Python, SQL, and Bash code chunks inside Markdown narrative
- Renders to HTML, PDF (via LaTeX), Word, PowerPoint, and many other formats through Pandoc
- Supports parameterized reports where input values change the output without editing the source
- Provides output templates for articles, slides (ioslides, Slidy, reveal.js, xaringan), dashboards (flexdashboard), and websites
- Integrates with knitr for code execution and caching, and with Pandoc for format conversion
Architecture Overview
An R Markdown file (.Rmd) is processed in two stages. First, knitr reads the file, executes each code chunk in an R session, captures the output, and produces a plain Markdown (.md) file. Second, Pandoc converts the Markdown to the target format (HTML, PDF, DOCX). R Markdown's YAML front matter specifies the output format and options. Custom output formats can be defined as R functions that configure Pandoc flags and provide templates.
Self-Hosting & Configuration
- Install the rmarkdown package from CRAN; Pandoc is bundled with RStudio or can be installed separately
- Configure output options in the YAML header: title, author, date, output format, and format-specific settings
- Use
params:in the YAML header for parameterized reports that accept input values at render time - Enable code chunk caching with
knitr::opts_chunk$set(cache = TRUE)to speed up iterative rendering - Deploy rendered HTML reports to RPubs, RStudio Connect, or any static web host
Key Features
- Single-source reproducibility: the document IS the analysis, ensuring results always match the code
- Parameterized reports let users generate customized outputs without modifying the source
- Chunk options control execution, display, caching, figure size, and error handling per chunk
- Inline R expressions (
r expr) embed computed values directly in narrative text - Ecosystem of extension packages adds specialized formats: flexdashboard, xaringan, distill, blogdown
Comparison with Similar Tools
- Quarto — the next-generation successor to R Markdown, supporting Python, Julia, and Observable alongside R; R Markdown remains stable and widely used
- Jupyter Notebook — supports many languages and is dominant in Python; R Markdown produces cleaner version-controlled source files
- Marimo — reactive Python notebooks; R Markdown is batch-rendered and document-oriented rather than interactive
- LaTeX — full typesetting power; R Markdown provides a simpler Markdown front-end that can still output through LaTeX
- Org Mode (Emacs) — literate programming in Emacs; R Markdown is more accessible and has broader tool support
FAQ
Q: What is the difference between R Markdown and Quarto? A: Quarto is the successor with multi-language support and a standalone CLI. R Markdown is R-centric and relies on the rmarkdown R package. Both produce similar output.
Q: Can I use Python code in R Markdown?
A: Yes. Use {python} code chunks. The reticulate package bridges R and Python, allowing data sharing between the two.
Q: How do I create a PDF from R Markdown?
A: Set output: pdf_document in the YAML header. A LaTeX distribution (TinyTeX recommended) must be installed for PDF rendering.
Q: Is R Markdown suitable for academic papers? A: Yes. The rticles package provides templates for many journals. R Markdown handles citations, cross-references, and bibliographies.