Quarto en R: documentos reproducibles que combinan código, resultados y narrativa

Quarto es el sistema de publicación científica de Posit (la empresa antes conocida como RStudio) y el sucesor natural de R Markdown. Lo que lo diferencia es que ya no está atado a R: soporta R, Python, Julia y Observable JS en el mismo documento, con el mismo motor de renderizado y la misma sintaxis Markdown. Un archivo .qmd puede tener bloques de R y Python mezclados, y Quarto se encarga de ejecutarlos y componer el resultado.

Quarto 1.4, lanzado en 2024, introdujo los dashboards interactivos como formato nativo, sin necesidad de Shiny para los casos de uso más simples.

Estructura de un documento Quarto

Un archivo .qmd tiene una cabecera YAML y cuerpo en Markdown con bloques de código ejecutables:

# Ejemplo de archivo informe.qmd
# ---
# title: "Análisis de ventas 2025"
# author: "Equipo de datos"
# date: today
# format:
#   html:
#     toc: true
#     toc-depth: 3
#     theme: cosmo
#     code-fold: true
#     fig-width: 8
#     fig-height: 5
#   pdf:
#     geometry: margin=2cm
# execute:
#   echo: true
#   warning: false
#   cache: true
# ---
#
# ## Carga de datos
#
# ```{r}
# #| label: carga-datos
# #| message: false
# library(tidyverse)
# datos <- read_csv("ventas_2025.csv")
# glimpse(datos)
# ```
#
# ## Resumen estadístico
#
# ```{r}
# #| label: resumen
# datos |>
#   group_by(region, trimestre) |>
#   summarise(
#     total    = sum(importe),
#     media    = mean(importe),
#     n_pedidos = n(),
#     .groups = "drop"
#   ) |>
#   knitr::kable(digits = 2)
# ```

Renderizar documentos

# Desde R
quarto::quarto_render("informe.qmd")                      # HTML por defecto
quarto::quarto_render("informe.qmd", output_format = "pdf")
quarto::quarto_render("informe.qmd", output_format = "docx")

# Pasar parámetros al documento
quarto::quarto_render(
  "informe.qmd",
  execute_params = list(
    anyo    = 2025,
    region  = "Norte",
    mostrar_codigo = FALSE
  )
)
# Desde la terminal
# quarto render informe.qmd --to html
# quarto render informe.qmd --to pdf
# quarto preview informe.qmd  # vista previa en vivo con recarga automática
# quarto publish netlify      # publicar directamente en Netlify

Opciones de chunk y control de salida

Las opciones de cada bloque de código se especifican con la sintaxis #| justo dentro del bloque:

# Opciones de chunk disponibles:
# #| label: nombre-unico          # identificador del chunk
# #| echo: false                  # no mostrar el código
# #| eval: false                  # no ejecutar el código
# #| include: false               # ejecutar pero no incluir nada en el output
# #| warning: false               # suprimir warnings
# #| message: false               # suprimir mensajes
# #| cache: true                  # cachear resultado para re-renderizados rápidos
# #| fig-cap: "Título del gráfico"
# #| fig-alt: "Texto alternativo para accesibilidad"
# #| fig-width: 10
# #| fig-height: 6
# #| out-width: "80%"

# Ejemplo de chunk de gráfico bien documentado
# ```{r}
# #| label: grafico-ventas
# #| echo: false
# #| fig-cap: "Evolución de ventas por región (2025)"
# #| fig-width: 10
# #| fig-height: 5
# ggplot(datos, aes(x = fecha, y = importe, color = region)) +
#   geom_line() +
#   facet_wrap(~producto) +
#   theme_minimal()
# ```

Informes parametrizados

Una funcionalidad muy útil es la posibilidad de generar el mismo informe para distintos valores de parámetros. Se definen en el YAML y se accede a ellos con el objeto params:

# En el YAML del documento:
# params:
#   region: "Norte"
#   anyo: 2025

# En los chunks de R:
# datos_filtrados <- datos |>
#   filter(region == params$region, year(fecha) == params$anyo)

# Generar un informe por cada región desde R:
regiones <- c("Norte", "Sur", "Este", "Oeste")
purrr::walk(regiones, function(r) {
  quarto::quarto_render(
    "informe_regional.qmd",
    output_file    = paste0("informe_", r, "_2025.html"),
    execute_params = list(region = r, anyo = 2025)
  )
})

Presentaciones y dashboards

Quarto puede generar presentaciones en formato Revealjs (HTML interactivo), Beamer (PDF LaTeX) o PowerPoint. Los dashboards, introducidos en Quarto 1.4, permiten crear interfaces de análisis sin código JavaScript:

# Cabecera para un dashboard:
# ---
# title: "Dashboard de ventas"
# format: dashboard
# ---
#
# ## Fila 1 {height=40%}
#
# ### KPIs
#
# ```{r}
# #| content: valuebox
# #| title: "Ventas totales"
# list(
#   icon  = "cart",
#   color = "success",
#   value = scales::dollar(sum(datos$importe))
# )
# ```
#
# ## Fila 2 {height=60%}
#
# ### Gráfico
#
# ```{r}
# #| title: "Ventas por mes"
# ggplot(datos, aes(x = mes, y = importe)) + geom_col() + theme_minimal()
# ```

Publicar en Quarto Pub y otras plataformas

# Publicar en Quarto Pub (gratuito)
# quarto publish quarto-pub informe.qmd

# Publicar en GitHub Pages
# quarto publish gh-pages

# Publicar en Netlify
# quarto publish netlify

# Publicar un libro (proyecto multi-archivo)
# quarto create-project mi-libro --type book
# quarto render mi-libro/
# quarto publish gh-pages mi-libro/

Quarto cierra el círculo de lo que R ofrece para investigación reproducible: escribes el análisis, lo ejecutas, lo documentas y lo publicas en un solo flujo de trabajo. La alternativa de Julia también tiene soporte nativo en Quarto desde la versión 1.3, como puedes ver en el artículo sobre Julia para ciencia de datos. Y si combinas Quarto con reticulate, puedes mezclar R y Python en el mismo informe reproducible, algo que el artículo sobre reticulate explica en detalle.

Imagen: Pexels / RDNE Stock project

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP