Sesión 7

Quarto: tablas, citas y formatos

Juan David Leongómez

Universidad El Bosque

17 de junio de 2026

Agenda

  • Tablas básicas con kable()
  • Tablas atractivas con gt
  • Referencias cruzadas en documentos
  • Citas y referencias bibliográficas
  • Citar R y sus paquetes con citation()
  • Opciones de formato en el YAML

Parte 1

Tablas

Actividad 1 · 5 min

Recordatorio: resume pinguinos con dplyr

En un bloque de código en tu documento .qmd, crea el objeto resumen:

pinguinos <- penguins |> drop_na()

resumen <- pinguinos |>
    group_by(species) |>
    summarise(
        n          = n(),
        masa_media = mean(body_mass_g),
        masa_sd    = sd(body_mass_g),
        pico_medio = mean(bill_length_mm)
    )

Lo usarás en las actividades siguientes para crear tablas.

kable(): tablas al instante

kable() del paquete knitr convierte cualquier data frame en una tabla con una sola línea:

library(knitr)

resumen |> kable()
species n masa_media masa_sd pico_medio
Adelie 146 3706.164 458.6201 38.82397
Chinstrap 68 3733.088 384.3351 48.83382
Gentoo 119 5092.437 501.4762 47.56807

Suficiente para explorar datos o incluir una tabla rápida. Para presentaciones y publicaciones, gt ofrece mucho más control.

kable() tiene muchas opciones adicionales, y en compañia del paquete kableExtra permite hacer tablas complejas tanto en HTML como en LaTeX (PDF). Sin embargo, en esta sesión nos centraremos en gt.

Tablas con gt

gt crea tablas en HTML con una sintaxis de pipeline, igual que ggplot2 pero para tablas:

library(gt)

resumen |>
    gt()
species n masa_media masa_sd pico_medio
Adelie 146 3706.164 458.6201 38.82397
Chinstrap 68 3733.088 384.3351 48.83382
Gentoo 119 5092.437 501.4762 47.56807

Tablas con gt

resumen |>
    gt() |>
    tab_header(
        title    = "Pingüinos de Palmer",
        subtitle = "Resumen por especie"
    ) |>
    cols_label(
        species    = "Especie",
        n          = "N",
        masa_media = "Media (g)",
        masa_sd    = "DE (g)",
        pico_medio = "Pico (mm)"
    )
Pingüinos de Palmer
Resumen por especie
Especie N Media (g) DE (g) Pico (mm)
Adelie 146 3706.164 458.6201 38.82397
Chinstrap 68 3733.088 384.3351 48.83382
Gentoo 119 5092.437 501.4762 47.56807

Tablas con gt

resumen |>
    gt() |>
    tab_header(
        title    = "Pingüinos de Palmer",
        subtitle = "Resumen por especie"
    ) |>
    cols_label(
        species    = "Especie",
        n          = "N",
        masa_media = "Media (g)",
        masa_sd    = "DE (g)",
        pico_medio = "Pico (mm)"
    ) |>
    fmt_number(
        columns  = c(masa_media, masa_sd, pico_medio),
        decimals = 1
    ) |>
    tab_spanner(
        label   = "Masa corporal",
        columns = c(masa_media, masa_sd)
    )
Pingüinos de Palmer
Resumen por especie
Especie N
Masa corporal
Pico (mm)
Media (g) DE (g)
Adelie 146 3,706.2 458.6 38.8
Chinstrap 68 3,733.1 384.3 48.8
Gentoo 119 5,092.4 501.5 47.6

Tablas con gt

resumen |>
    gt() |>
    tab_header(
        title    = "Pingüinos de Palmer",
        subtitle = "Resumen por especie"
    ) |>
    cols_label(
        species    = "Especie",
        n          = "N",
        masa_media = "Media (g)",
        masa_sd    = "DE (g)",
        pico_medio = "Pico (mm)"
    ) |>
    fmt_number(
        columns  = c(masa_media, masa_sd, pico_medio),
        decimals = 1
    ) |>
    tab_spanner(
        label   = "Masa corporal",
        columns = c(masa_media, masa_sd)
    ) |>
    tab_source_note("Fuente: Gorman et al. (2014)") |>
    tab_footnote(
        footnote  = "Medida en milímetros",
        locations = cells_column_labels(pico_medio)
    )
Pingüinos de Palmer
Resumen por especie
Especie N
Masa corporal
Pico (mm)1
Media (g) DE (g)
Adelie 146 3,706.2 458.6 38.8
Chinstrap 68 3,733.1 384.3 48.8
Gentoo 119 5,092.4 501.5 47.6
1 Medida en milímetros
Fuente: Gorman et al. (2014)

gt tiene muchas opciones adicionales. Puedes explorarlas en la documentación oficial.

Referencias cruzadas: tablas en documentos

En un documento Quarto (no en presentaciones revealjs), puedes etiquetar una tabla y citarla en el texto:

En el bloque de código:

```{r}
#| label: tbl-resumen
#| tbl-cap: "Pingüinos de Palmer: resumen por especie"

resumen |> gt() |> ...
```

En el texto:

Como se observa en la @tbl-resumen, la
especie Gentoo tiene la mayor masa corporal.

Resultado renderizado:

Como se observa en la Tabla 1, la especie Gentoo tiene la mayor masa corporal.

La numeración automática y las referencias cruzadas funcionan en documentos (HTML, PDF, Word), no en presentaciones revealjs. El prefijo tbl- en el label es obligatorio. Lo mismo aplica para figuras con el prefijo fig- (en la siguiente sesión).

Actividad 2 · 6 min

Una tabla gt en tu documento

En tu documento .qmd, añade una sección nueva con una tabla a partir del objeto resumen que ya creaste:

  1. Convierte resumen en tabla con gt()
  2. Añade un título con tab_header()
  3. Etiqueta las columnas con cols_label()

Parte 2

Citas y referencias bibliográficas

El archivo .bib

Las referencias se guardan en un archivo de texto con extensión .bib. Cada entrada tiene un tipo (@Article, @Book, @Manual…), una clave única y los campos de la referencia:

@Article{Spitzer2006,
  title   = {A Brief Measure for Assessing Generalized Anxiety Disorder},
  author  = {Robert L. Spitzer and Kurt Kroenke and Janet B. W. Williams
             and Bernd Löwe},
  journal = {Archives of Internal Medicine},
  year    = {2006},
  volume  = {166},
  number  = {10},
  pages   = {1092--1097},
  doi     = {10.1001/archinte.166.10.1092},
}

La clave Spitzer2006 es la que usarás para citar. Puedes elegir cualquier clave, pero un formato como AutorAño es claro y fácil de recordar.

Los autores van siempre separados por and. Para indicar explícitamente el(los) apellido(s), usa la forma Apellido, Nombre; esto es indispensable para autores con dos apellidos:

{Leongómez, Juan David and Wickham, Hadley}

Con Nombre Apellido, BibTeX puede confundir cuál es el apellido.

Fuentes de BibTeX

No necesitas escribir las entradas a mano. Hay varias fuentes, de mejor a peor:

  1. Páginas de editoriales (ScienceDirect, Springer, Wiley, APA PsycNet…) → busca “Export citation” o “Cite” → selecciona BibTeX. Entradas completas, con DOI.

  2. Editor visual de RStudio → inserta una cita → busca por DOI, PubMed ID o título. No necesitas ningún gestor instalado.

  3. Gestores de referencias (Zotero, Mendeley, EndNote…) → exporta tu biblioteca o selección como .bib. La integración de Zotero con RStudio es especialmente fluida y vale la pena adoptar.

  4. Google Scholar → “Citar” → BibTeX. Práctico para buscar rápido, pero casi nunca incluye el DOI, lo que limita la calidad de la referencia.

El archivo .bib es texto plano: puedes crearlo en RStudio con File > New File > Text File, guardarlo como referencias.bib en la raíz del proyecto (junto a mi_reporte.qmd y curso_r.Rproj), y pegar las entradas que vayas recopilando.

El editor visual de RStudio

El editor visual de RStudio permite insertar citas directamente, sin salir del documento:

  1. Activa el editor visual: botón Visual en la barra superior del editor (o Ctrl+Shift+F4)
  2. Ve a Insert > Citation…
  3. Busca por DOI, PubMed ID, CrossRef o en tu biblioteca de Zotero
  4. RStudio inserta la cita en el texto y añade la entrada al .bib automáticamente

Si usas Zotero, aparece directamente en el panel de búsqueda de citas del editor visual. Solo tienes que mantener Zotero abierto mientras trabajas en RStudio.

Configurar el YAML del documento

Añade dos líneas al YAML de tu documento Quarto:

---
title: "Mi reporte"
format: html
bibliography: referencias.bib
csl: https://www.zotero.org/styles/apa
---

bibliography apunta al archivo .bib. csl define el estilo de citas: el enlace descarga el estilo APA directamente desde el repositorio de Zotero, sin necesidad de guardar ningún archivo.

Puedes usar cualquier estilo del repositorio zotero.org/styles. Busca por nombre de revista o estilo, copia el enlace y pégalo en csl:. La lista de referencias aparece automáticamente al final del documento.

Citar en el texto

Con el archivo .bib configurado, citar es tan simple como escribir la clave:

Sintaxis Resultado
@Spitzer2006 Spitzer et al. (2006)
[@Spitzer2006] (Spitzer et al., 2006)
[@R-base; @tidyverse] (R Core Team, 2026; Wickham et al., 2019)
[-@Spitzer2006] (2006) — suprime el autor

La lista de referencias completa se genera sola al final del documento.

En el editor visual, al escribir @ aparece un menú de autocompletado con todas las claves de tu .bib. No necesitas recordarlas de memoria.

Citar R y sus paquetes

citation() devuelve la referencia de R o de cualquier paquete:

# Citar R
citation()

# Citar un paquete
citation("ggplot2")

toBibtex() la convierte al formato BibTeX listo para copiar al .bib:

# Obtener el BibTeX
toBibtex(citation())
toBibtex(citation("ggplot2"))
@Manual{,
  title = {R: A Language and Environment for Statistical Computing},
  author = {{R Core Team}},
  organization = {R Foundation for Statistical Computing},
  address = {Vienna, Austria},
  year = {2025},
  url = {https://www.R-project.org/},
}

Si usas datos o herramientas de R en un trabajo académico, citar R y los paquetes relevantes es una buena práctica. Muchos revisores ya lo esperan y es lo minimo que podemos hacer para dar crétido a las y los autores de paquetes que usamos.

Actividad 3 · 8 min

Añade citas a tu documento

⬇ Descargar referencias.bib

Guarda el archivo en la raíz de tu proyecto curso_r (junto a mi_reporte.qmd). Luego:

  1. Añade bibliography: referencias.bib y csl: https://www.zotero.org/styles/apa al YAML
  2. Cita @tidyverse en algún párrafo del documento
  3. Obtén el BibTeX de citation("gt") con toBibtex(), añádelo al .bib y cítalo
  4. Agrega algunas citas a artículos científicos
  5. Renderiza y verifica que la lista de referencias aparece al final

Parte 3

Opciones de formato

Tabla de contenido y numeración

Opciones del YAML que mejoran la navegación del documento:

---
title: "Mi reporte"
format:
  html:
    toc: true
    toc-depth: 3
    number-sections: true
---
Opción Qué hace
toc: true Tabla de contenido al inicio
toc-depth: 3 Hasta el tercer nivel de título
number-sections: true Numera las secciones (1, 1.1, 1.1.1…)

La tabla de contenido genera automáticamente enlaces a cada sección.

code-fold y temas HTML

---
format:
  html:
    code-fold: true
    theme: cosmo
---

code-fold: true oculta el código por defecto pero deja un botón “Show code” para quien quiera verlo. Útil para reportes donde el texto es lo principal.

Otros temas disponibles: flatly, minty, journal, lumen, pulse, sandstone, united, yeti, entre otros.

Puedes previsualizar todos los temas en quarto.org/docs/output-formats/html-themes.html

El tema cosmo y flatly, por ejemplo, son opciones limpias y legibles. journal imita el estilo de una publicación académica.

Otros formatos de salida

Con Quarto puedes cambiar el formato de salida con solo editar el YAML:

format: docx   # Word
format: pdf    # PDF (requiere LaTeX)
format: html   # HTML (el más completo y flexible)

Para Word (docx), la mayoría de opciones de HTML funcionan igual. Es útil cuando el destinatario necesita un archivo editable o cuando la institución exige ese formato.

Para PDF se necesita una instalación de LaTeX. Si no tienes LaTeX, puedes instalar tinytex desde R con tinytex::install_tinytex().

Actividad final · 15 min

Mini-reporte completo

Edita el YAML y el contenido de tu documento .qmd para que incluya:

  1. Tabla de contenido (toc: true) y secciones numeradas
  2. Un tema HTML distinto al defecto (prueba cosmo, flatly o cualquier otro)
  3. code-fold: true para que el código esté oculto por defecto
  4. La tabla gt de la Actividad 2, con su referencia cruzada (@tbl-xxx) en el texto
  5. Al menos dos citas de la bibliografía

Renderiza y revisa el resultado en el navegador.

Antes de terminar…

Quiz rápido

Quiz · 1 de 3

¿Qué función de gt agrupa varias columnas bajo un encabezado común?

    1. cols_group()
    1. tab_header()
    1. tab_spanner()
    1. group_cols()

c) tab_spanner() crea un encabezado que abarca varias columnas. tab_header() añade un título general a la tabla, no agrupa columnas.

Quiz · 2 de 3

¿Cuál de estas sintaxis produce una cita entre paréntesis en Quarto?

    1. {@Spitzer2006}
    1. @Spitzer2006
    1. [@Spitzer2006]
    1. (Spitzer2006)

c) [@clave] produce una cita entre paréntesis: (Spitzer et al., 2006). Sin corchetes, @clave produce una cita narrativa: Spitzer et al. (2006), adecuada para usar el nombre del autor como sujeto de la oración.

Quiz · 3 de 3

Quieres que el código de tu documento esté oculto por defecto pero que el lector pueda verlo si quiere. ¿Qué opción usas en el YAML?

    1. echo: false
    1. hide-code: true
    1. code-fold: true
    1. collapse: true

c) code-fold: true oculta el código pero añade un botón “Show code”. echo: false lo oculta sin posibilidad de verlo. Las otras dos opciones no existen en Quarto.

Hasta la próxima sesión

¡Gracias!

jdleongomez.github.io/curso-r