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
Hasta ahora escribíamos scripts (.R):
archivos de puro código. R Markdown (.Rmd) es distinto: es
un solo documento donde conviven tres cosas:
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.
.RmdTodo archivo .Rmd se arma con las mismas tres piezas.
Vamos una por una.
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í.
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 |  |
(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.
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))
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.
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.Rmdesto 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 connrow()), así que la cifra nunca queda desactualizada.
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.
Para convertir el .Rmd en el informe final tienes dos
caminos:
{{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.
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.