Introducción a R Markdown

Un solo documento donde el texto, el código y sus resultados viven juntos — la base del informe que armaremos a continuación

1. ¿Qué es R Markdown?

Hasta ahora escribíamos scripts (.R): archivos de puro código. R Markdown (.Rmd) es distinto: es un solo documento donde conviven tres cosas:

  • Texto que explica (como este párrafo),
  • Código de R que calcula y grafica,
  • y los resultados de ese código (tablas, números, gráficos), insertados automáticamente.

Cuando “tejes” el documento (lo veremos en la sección 6), R ejecuta todo el código de arriba abajo y produce un informe terminado en HTML, PDF o Word.

¿Por qué importa? Porque el informe es reproducible. No copias y pegas gráficos a mano: si mañana cambian los datos, vuelves a tejer y todo el documento se actualiza solo —números, tablas y gráficos incluidos—. Ese es exactamente el principio detrás del 4_informe_final.Rmd que veremos después.

2. Los tres ingredientes de todo .Rmd

Todo archivo .Rmd se arma con las mismas tres piezas. Vamos una por una.

2.1 El encabezado YAML

Es el bloque del principio, encerrado entre dos líneas de ---. Define los metadatos y el formato de salida del documento. Es lo primero que R lee:

---
title: "Introducción a R Markdown"
author: "Carlos Amortegui"
date: "2026-09-25"
output:
  html_document:      # el formato de salida: una página HTML
    toc: true         # genera automáticamente una tabla de contenidos
    toc_float: true   # y la deja flotando a la izquierda mientras te desplazas
    theme: flatly     # un tema visual prediseñado
    code_folding: show # los bloques de código se pueden plegar/desplegar
---

El YAML es sensible a la sangría (los espacios importan, como en Python). html_document va indentado bajo output, y sus opciones (toc, theme…) van indentadas bajo html_document. Si algo del formato “no funciona”, casi siempre es un problema de sangría aquí.

2.2 El texto en Markdown

Entre bloque y bloque de código escribes en Markdown, un lenguaje de formato muy sencillo: escribes casi como texto normal y con pocos símbolos consigues títulos, negritas, listas, etc. Esta es la chuleta mínima:

Quieres… Escribes Se ve así
Título de sección # Título (encabezado grande)
Subtítulo ## Subtítulo (encabezado menor)
Negrita **texto** texto
Cursiva *texto* texto
Lista con viñetas - item • item
Lista numerada 1. item 1. item
código en el texto `código` código
Enlace [Konrad](https://www.konradlorenz.edu.co) Konrad
Imagen ![alt](ruta/imagen.png) (inserta la imagen)

Cada # adicional baja un nivel de título (# = nivel 1, ## = nivel 2, ### = nivel 3). La tabla de contenidos (toc: true) se arma automáticamente a partir de estos títulos.

2.3 Los bloques de código (chunks)

El código de R va dentro de chunks: bloques que empiezan con ```{r} y terminan con ```. Todo lo que esté adentro es R que se ejecuta al tejer. Por ejemplo, este chunk:

{{r}} 2 + 2

…al tejerse muestra el código y su resultado debajo. Compruébalo — este de aquí sí se ejecuta de verdad:

2 + 2
## [1] 4

Puedes ponerle un nombre al chunk (ayuda a ubicar errores) escribiéndolo justo después de la r:

{{r mi-primer-calculo}} mean(c(10, 20, 30))

3. Anatomía de un chunk y sus opciones

Después del nombre, dentro de las llaves {r ...}, puedes poner opciones separadas por comas que controlan cómo se comporta ese chunk. Estas son las que más vas a usar (y las que verás en el informe final):

Opción Qué hace Cuándo usarla
echo = FALSE Ejecuta el código pero no lo muestra (solo el resultado) Cuando quieres el gráfico/tabla, no el código
eval = FALSE Muestra el código pero no lo ejecuta Para enseñar código de ejemplo sin correrlo
include = FALSE Ejecuta el código pero no muestra nada (ni código ni resultado) Para el chunk de arranque (setup), librerías, carga de datos
warning = FALSE Oculta los warnings de R Para que el informe no se llene de avisos técnicos
message = FALSE Oculta los mensajes (ej. los de library()) Igual que arriba
fig.width, fig.height Ancho y alto del gráfico (en pulgadas) Para ajustar el tamaño de una figura

En vez de repetir estas opciones en cada chunk, se fijan una sola vez al principio con knitr::opts_chunk$set(...) (el chunk setup de este documento, arriba del todo). Así todos los chunks las heredan y solo sobreescribes las que necesites en un chunk puntual.

4. Código en línea: meter un cálculo dentro de una frase

No todo el código va en chunks. A veces quieres insertar un número calculado en medio de un párrafo. Eso se hace con código en línea: se escribe con la letra r seguida del código, entre comillas invertidas simples. En el texto fuente escribes algo como:

El curso tiene `r nrow(estudiantes)` estudiantes inscritos.

…y al tejer, R reemplaza esa parte por el número real. Esto es clave para la reproducibilidad: el texto también se actualiza solo. Un ejemplo que sí se ejecuta en este documento — la fecha de hoy calculada por R es: 02 de October de 2026, y 10 * 3 da 30.

En el 4_informe_final.Rmd esto se usa mucho: el número de registros del dataset se inserta directo en la frase de la introducción con código en línea (tomándolo del propio dato con nrow()), así que la cifra nunca queda desactualizada.

5. Un ejemplo en vivo

Juntemos todo: un chunk que crea unos datos, define la paleta y el tema del curso (los mismos que ya usamos en los gráficos de Clase 2) y dibuja una gráfica. Fíjate cómo el código y su resultado aparecen juntos en el informe.

library(tidyverse)  # incluye ggplot2 (gráficos), dplyr (manipular datos) y más

# Paleta oficial del curso -- se define una vez y se reutiliza en cada gráfico.
morado   <- "#351A4F"
magenta  <- "#D9006C"
turquesa <- "#168C86"
gris     <- "#D9D6DD"

# Tema visual compartido del curso (mismo que en los scripts de Clase 2).
tema_clase <- theme_minimal(base_size = 12) +
  theme(
    plot.title.position = "plot",
    plot.title = element_text(face = "bold", size = 15, hjust = 0),
    plot.subtitle = element_text(size = 10.5, color = "grey35", hjust = 0),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(hjust = 0, color = "grey45", size = 8.5),
    plot.margin = margin(10, 20, 10, 10)
  )

# tibble(): crea una tabla de datos a mano (una versión moderna de data.frame).
# Aquí inventamos un dato mínimo solo para el ejemplo.
herramientas <- tibble(
  herramienta = c("R", "Python", "Excel", "Power BI"),
  estudiantes = c(18, 15, 22, 12)
)

# fct_reorder(): ordena las barras por su valor (no alfabéticamente).
ggplot(herramientas, aes(x = estudiantes, y = fct_reorder(herramienta, estudiantes))) +
  geom_col(fill = morado, width = 0.65) +      # geom_col(): barras a partir de un valor ya calculado
  labs(
    title = "Excel sigue siendo la herramienta más usada del grupo",
    subtitle = "Datos de ejemplo, solo para ilustrar el chunk",
    x = "N.º de estudiantes", y = NULL
  ) +
  tema_clase +
  theme(panel.grid.major.y = element_blank())

Ese bloque completo —código y gráfico— salió de un solo chunk. Eso es R Markdown: la explicación, el código y el resultado, en el mismo lugar.

6. Cómo se teje (Knit)

Para convertir el .Rmd en el informe final tienes dos caminos:

  1. Botón Knit en RStudio (arriba del editor, con un ícono de ovillo de lana 🧶). Es lo más común: haces clic y RStudio genera el HTML y lo abre.
  2. Por código, útil cuando automatizas:

{{r eval=FALSE}} rmarkdown::render("0_introduccion_rmarkdown.Rmd")

Regla de oro: al tejer, R ejecuta el documento desde cero, de arriba hacia abajo, en una sesión limpia. Por eso el orden de los chunks importa: si un chunk usa una variable, esa variable tuvo que crearse en un chunk anterior. Si el documento teje bien pero en tu consola “funcionaba”, casi siempre es porque tenías algo en memoria que el .Rmd no crea explícitamente.

7. Del ejemplo al informe real

Todo lo que viste aquí, a escala pequeña, es exactamente lo que hace el 4_informe_final.Rmd que abriremos a continuación. Este es el mapa para que lo reconozcas:

Concepto de esta guía Dónde aparece en 4_informe_final.Rmd
Encabezado YAML con toc, theme Las primeras líneas del archivo (título, autor, flatly, toc_float)
Chunk setup con include=FALSE El primer chunk: fija echo, warning, message para todo el informe
Chunk de librerías El chunk librerias: carga tidyverse, leaflet, DT, plotly…
Chunk de carga de datos El chunk datos: lee los dos CSV con read_csv()
Paleta + tema_clase una vez El chunk estilo: define morado/magenta/turquesa y el tema
Código en línea Frases donde el nº de registros se inserta con código en línea usando comma(nrow(...)), en la introducción
echo/eval/include por chunk A lo largo de todo el informe, según convenga mostrar o no el código
Texto en Markdown entre chunks Todas las secciones numeradas (# 1. Introducción, # 2. Objetivos…)

En una frase: un .Rmd es texto + código + resultados en un mismo archivo que, al tejerse, se convierte en un informe reproducible. Con eso en mente, el 4_informe_final.Rmd deja de verse como un muro de código y se lee como lo que es: un documento con estas mismas piezas, solo que más grande y con datos reales.


Siguiente paso: abrir 4_informe_final.Rmd y recorrerlo chunk por chunk.