Apunte 3 — Quarto: reportes reproducibles

Analítica de Personas · Semestre otoño 2026 · Semana 1 · Prof. René Gempp

1. ¿Qué es Quarto y por qué lo usamos?

Quarto es un sistema de publicación que combina texto narrativo, código R y resultados (tablas, gráficos) en un solo documento. Escribes un archivo .qmd, haces click en "Render", y obtienes un reporte profesional en HTML, PDF o Word.

¿Por qué importa para people analytics? Porque el entregable nunca es "un script de R". El entregable es un reporte para alguien que no sabe R: el VP, el directorio, un gerente de línea. Quarto te permite producir ese reporte sin salir de RStudio, y si los datos cambian, solo vuelves a renderizar.

Script .R vs. documento .qmd Un script .R es para ti (análisis, exploración, pruebas). Un documento .qmd es para tu audiencia (reporte con interpretaciones, visualizaciones y recomendaciones). En el curso usamos ambos: el script para trabajar y el .qmd para entregar.

2. Anatomía de un archivo .qmd

Todo documento Quarto tiene tres partes que se alternan:

① ENCABEZADO YAML
--- title: "Diagnóstico de Fuerza Laboral" author: "Tu nombre" date: "2025-03-11" format: html: theme: cosmo toc: true code-fold: true execute: warning: false ---
② TEXTO MARKDOWN
## Composición de la fuerza laboral InnovaCo cuenta con 1.200 empleados distribuidos en 6 departamentos. A continuación se presenta el análisis descriptivo.
③ CHUNK DE CÓDIGO R
```{r} #| label: headcount innovaco |> count(departamento, sort = TRUE) ```
② TEXTO MARKDOWN
El departamento más grande es Desarrollo de Software con 417 personas (35% del total).
③ CHUNK DE CÓDIGO R
```{r} #| label: fig-edad ggplot(innovaco, aes(x = edad)) + geom_histogram(binwidth = 3) ```

Este patrón se repite tantas veces como necesites: texto → código → texto → código → ...

3. El encabezado YAML en detalle

El YAML (las líneas entre ---) configura todo el documento. Es muy sensible a la indentación: cada nivel se indenta con exactamente 2 espacios.

---
title: "Diagnóstico de Fuerza Laboral — InnovaCo SpA"
subtitle: "Reporte para el VP de Personas"
author: "Tu nombre"
date: "2025-03-11"
format:                          # ← nivel 0
  html:                          # ← nivel 1 (2 espacios)
    theme: cosmo                 # ← nivel 2 (4 espacios)
    toc: true                   # tabla de contenidos
    toc-depth: 2                # hasta qué nivel de título
    code-fold: true             # código colapsado por defecto
    code-summary: "Ver código"  # texto del botón para expandir
    number-sections: true       # numerar secciones
execute:
  echo: true                    # mostrar código en el output
  warning: false                # ocultar warnings de R
  message: false                # ocultar mensajes de R
---

Opciones YAML más usadas

OpciónQué haceValores
themeEstilo visual del HTMLcosmo, flatly, journal, lumen, sandstone
tocTabla de contenidos automáticatrue / false
toc-depthHasta qué nivel de título incluir en el TOC2 (incluye ## y ###), 3
code-foldCódigo aparece colapsado (el lector puede expandirlo)true / false
echo¿Mostrar el código en el documento?true / false
warning¿Mostrar warnings de R?true / false
message¿Mostrar mensajes de R (ej: al cargar paquetes)?true / false
¿Por qué code-fold: true? Porque el destinatario del reporte es un ejecutivo, no un programador. Con code-fold, el reporte muestra solo los resultados (tablas, gráficos, texto), pero el código queda disponible para quien quiera verificar cómo se hizo el análisis. Lo mejor de dos mundos.
Error #1: Indentación YAML YAML es estricto: usa solo espacios (no tabs) y respeta la jerarquía. Si html: tiene 2 espacios, theme: necesita 4 espacios. Si el documento no renderiza y el error menciona "YAML" o "parsing", revisa los espacios.

4. Texto en Markdown

El texto fuera de los chunks de código se escribe en Markdown, un formato de texto simple que se convierte automáticamente a HTML con formato:

Lo que escribes en el .qmd

## Título de sección

### Subtítulo

Texto normal de un párrafo.

Texto en **negrita** y en *cursiva*.

- Primer punto
- Segundo punto

1. Paso uno
2. Paso dos

> Cita textual o destacado

[Enlace a Google](https://google.com)

`código_en_línea()`

Lo que se ve en el HTML

Título de sección

Subtítulo

Texto normal de un párrafo.

Texto en negrita y en cursiva.

  1. Paso uno
  2. Paso dos
Cita textual o destacado

Enlace a Google

código_en_línea()

Callouts: cajas de destaque

Quarto tiene cajas especiales para destacar información. Se usan mucho en reportes ejecutivos:

::: {.callout-note}
## Hallazgo clave
La tasa de rotación en Soporte Técnico (35%)
duplica la del resto de la empresa.
:::

::: {.callout-warning}
## Señal de alerta
La satisfacción en Ventas cayó 8 puntos respecto
al período anterior.
:::

::: {.callout-tip}
## Recomendación
Se sugiere realizar entrevistas de salida
focalizadas en Soporte Técnico durante marzo.
:::
TipoColorUso sugerido
.callout-noteAzulInformación general, hallazgos
.callout-tipVerdeRecomendaciones, buenas prácticas
.callout-warningAmarilloPrecauciones, señales de alerta
.callout-importantRojoInformación crítica, urgente

5. Chunks de código R

Los chunks son los bloques donde va el código R. Abren con ```{r} y cierran con ```. Todo lo que está entre esos delimitadores se ejecuta cuando renderizas el documento.

Estructura de un chunk

```{r}
#| label: mi-analisis
#| fig-cap: "Distribución de edad en InnovaCo"
#| fig-width: 8
#| fig-height: 4.5

ggplot(innovaco, aes(x = edad)) +
  geom_histogram(binwidth = 3, fill = "#2C5F2D") +
  theme_minimal()
```

Las líneas que empiezan con #| (hashpipe) son opciones del chunk. Controlan cómo se ejecuta y se muestra ese bloque específico.

Opciones de chunk más usadas

OpciónQué haceValores comunes
#| label: nombreNombre identificador del chunk (para referencia)Texto sin espacios: headcount, fig-edad
#| echo: falseOculta el código, muestra solo el resultadotrue (default) / false
#| eval: falseMuestra el código pero NO lo ejecutatrue (default) / false
#| warning: falseOculta warnings de este chunk específicotrue / false
#| message: falseOculta mensajes (ej: al cargar paquetes)true / false
#| fig-cap: "Texto"Agrega un título debajo del gráficoTexto entre comillas
#| fig-width: 8Ancho del gráfico (pulgadas)6, 8, 10
#| fig-height: 4.5Alto del gráfico (pulgadas)4, 4.5, 6
Opciones globales vs. locales Las opciones en el YAML bajo execute: se aplican a todos los chunks. Las opciones con #| dentro de un chunk se aplican solo a ese chunk y sobreescriben las globales. Ejemplo: si en el YAML tienes echo: true pero en un chunk pones #| echo: false, ese chunk específico no mostrará código.

El primer chunk: siempre setup

Por convención, el primer chunk de todo documento .qmd carga los paquetes y los datos. Se llama setup:

```{r}
#| label: setup
#| message: false

library(tidyverse)
innovaco <- read_csv("innovaco_empleados.csv")
```
Error #2: paquete no cargado en el .qmd Que tidyverse esté cargado en tu consola de RStudio no significa que esté cargado en el .qmd. Cada documento es independiente. El library(tidyverse) debe estar en el primer chunk del .qmd, siempre.

6. Insertar un chunk: el atajo de teclado

Nunca escribas los ```{r} a mano. Usa el atajo:

SistemaAtajo
Windows / LinuxCtrl + Alt + I
MacCmd + Option + I

Esto inserta automáticamente un chunk completo con apertura y cierre. Solo tienes que escribir el código adentro.

Ejecutar chunks mientras trabajas

AcciónAtajoQué hace
Ejecutar línea actualCtrl + EnterEjecuta la línea donde está el cursor
Ejecutar chunk completoCtrl + Shift + EnterEjecuta todo el chunk actual
Ejecutar todos los chunks anterioresCtrl + Alt + PEjecuta desde el inicio hasta el chunk actual
Renderizar documento completoCtrl + Shift + KGenera el HTML final
Flujo de trabajo recomendado Mientras desarrollas tu reporte, ejecuta chunks individualmente con Ctrl + Shift + Enter para verificar que funcionan. Cuando todo esté listo, renderiza con Ctrl + Shift + K para generar el HTML final.

7. Archivos y carpetas: la regla de oro

Cuando renderizas un .qmd, Quarto busca los archivos (como el CSV) relativo a donde está el .qmd, no al working directory de RStudio. La forma más simple de evitar problemas:

Pon todo en la misma carpeta:

mi_proyecto/
├── clase01_reporte_vp.qmd     # Tu documento Quarto
├── clase01_script.R            # Tu script de trabajo
└── innovaco_empleados.csv      # Los datos

Dentro del .qmd, la ruta es simplemente:

innovaco <- read_csv("innovaco_empleados.csv")

✗ Esto NO funciona

# Ruta absoluta:
read_csv("C:/Users/Juan/datos.csv")

# Archivo en otra carpeta:
read_csv("../Descargas/datos.csv")

✓ Esto SÍ funciona

# Mismo directorio que el .qmd:
read_csv("innovaco_empleados.csv")

# Subcarpeta dentro del proyecto:
read_csv("datos/innovaco_empleados.csv")

8. Código en línea: insertar resultados dentro del texto

Puedes insertar resultados de R directamente dentro del texto narrativo usando la sintaxis `r expresión`. Esto es muy poderoso para reportes porque los números se actualizan automáticamente:

InnovaCo cuenta con `r nrow(innovaco)` empleados.
La edad promedio es de `r round(mean(innovaco$edad), 1)` años.
La tasa de rotación global alcanza el
`r scales::percent(mean(innovaco$rotacion == "Sí"), accuracy = 0.1)`.

En el HTML renderizado esto aparecería como:

InnovaCo cuenta con 1.200 empleados. La edad promedio es de 34.4 años. La tasa de rotación global alcanza el 27.2%.
¿Cuándo usar código en línea? Para cifras que mencionas en el texto narrativo y que podrían cambiar si cambias los datos. Así nunca tendrás un reporte donde el texto dice "1.200 empleados" pero la tabla dice "1.195".

9. Renderizar: de .qmd a HTML

Cuando haces click en Render (o Ctrl + Shift + K), Quarto:

  1. Lee el YAML y configura el documento
  2. Ejecuta todos los chunks de arriba hacia abajo, en orden
  3. Convierte el Markdown a HTML con formato
  4. Inserta los resultados (tablas y gráficos) donde corresponde
  5. Genera el archivo .html en la misma carpeta que el .qmd
Error #3: orden de ejecución Al renderizar, los chunks se ejecutan de arriba hacia abajo, como un script nuevo. Si en el chunk 5 usas un objeto que se crea en el chunk 8, dará error. Asegúrate de que cada objeto se cree antes de usarse. El chunk setup (que carga datos y paquetes) siempre va primero.

10. Los 7 errores más comunes y cómo resolverlos

#SíntomaCausaSolución
1 Error de parsing al renderizar, menciona "YAML" Indentación incorrecta en el encabezado YAML. Probablemente usaste tabs en vez de espacios, o la jerarquía no es consistente. Revisa que cada nivel tenga exactamente 2 espacios más. Usa solo espacios, nunca tabs.
2 Chunk no se ejecuta, aparece como texto plano Falta {r} en la apertura, o falta el ``` de cierre. Usa Ctrl+Alt+I para insertar chunks. Nunca escribas los backticks a mano.
3 'archivo.csv' does not exist El CSV no está en la misma carpeta que el .qmd, o la ruta es incorrecta. Pon el .csv en la misma carpeta que el .qmd. Usa ruta relativa: "innovaco_empleados.csv"
4 could not find function "count" No cargaste library(tidyverse) en el .qmd. Que esté cargado en la consola no basta. Agrega library(tidyverse) al primer chunk (setup).
5 object 'rotacion_depto' not found Usas un objeto que se crea más abajo en el documento, o en un chunk que no se ejecutó. Mueve la creación del objeto antes de su uso. Los chunks se ejecutan de arriba hacia abajo.
6 El YAML o el Markdown dan error en la consola de R Estás ejecutando código Quarto en la consola de R en vez de dentro del archivo .qmd. El código Quarto solo funciona dentro del archivo .qmd. La consola es solo para código R puro.
7 Aparecen mensajes como ── Attaching core tidyverse packages ── en el reporte No silenciaste los mensajes de carga de paquetes. En el YAML: message: false bajo execute:. O en el chunk setup: #| message: false

11. Checklist de debugging

Si tu .qmd no renderiza, sigue estos pasos en orden:

  1. Lee el mensaje de error. Indica el número de línea donde falló.
  2. Revisa el YAML. ¿Los --- están completos? ¿La indentación es correcta?
  3. Revisa los chunks. ¿Todos abren con ```{r} y cierran con ```?
  4. Revisa la ruta del CSV. ¿El archivo está donde el .qmd espera encontrarlo?
  5. Revisa el primer chunk. ¿Tiene library(tidyverse) y read_csv()?
  6. Ejecuta chunk por chunk. Usa el botón ▶ de cada chunk para encontrar cuál falla.
  7. Si nada funciona: cierra RStudio, abre de nuevo y vuelve a intentar.

12. Referencia rápida de Markdown

Lo que escribesLo que se ve
# Título 1Título principal (rara vez se usa, el title: del YAML lo reemplaza)
## Título 2Sección principal
### Título 3Subsección
**negrita**negrita
*cursiva*cursiva
`código`código
- item● item (lista con viñetas)
1. paso1. paso (lista numerada)
> citaBloque de cita
[texto](url)Hipervínculo
---Línea horizontal de separación
`r expresión`Resultado de la expresión R (código en línea)
Líneas en blanco importan En Markdown, necesitas una línea en blanco entre un párrafo y una lista, entre dos párrafos, y antes y después de un chunk de código. Si el formato se ve raro, probablemente falta una línea en blanco.

13. Atajos de teclado: resumen

AcciónWindows / LinuxMac
Insertar chunkCtrl + Alt + ICmd + Option + I
Ejecutar línea actualCtrl + EnterCmd + Enter
Ejecutar chunk completoCtrl + Shift + EnterCmd + Shift + Enter
Ejecutar chunks anterioresCtrl + Alt + PCmd + Option + P
Renderizar documentoCtrl + Shift + KCmd + Shift + K
Insertar pipe |>Ctrl + Shift + MCmd + Shift + M
Insertar asignación <-Alt + -Option + -