Modelado Matemático y Reportes Automatizados con R Markdown
En esta clase revisaremos, paso a paso, cómo crear informes técnicos reproducibles utilizando R Markdown. Retomaremos los contenidos abordados en clases anteriores sobre la resolución de sistemas de ecuaciones en R y aprenderemos a documentar los procedimientos de forma clara y estructurada, generando reportes automatizados en formatos profesionales como HTML y PDF.
Objetivos de Aprendizaje
- Aplicar métodos algebraicos y gráficos en R para resolver sistemas de ecuaciones.
- Interpretar gráficamente la solución de sistemas lineales en dos variables.
- Evaluar la precisión de las soluciones numéricas obtenidas en R.
- Diseñar estrategias propias para resolver ecuaciones mediante código en R.
- Comunicar los resultados de soluciones algebraicas y gráficas mediante informes estructurados en R Markdown.
Índice de Contenidos
1. Introducción a R Markdown
2. Estructura de un Informe Técnico Automatizado
3. Resolución de Sistemas de Ecuaciones en R
4. Desafío propuesto: distribución de materiales educativos
Introducción a R Markdown
R Markdown es una herramienta integrada en RStudio que permite combinar texto, código y visualizaciones en un mismo documento. Desde un único archivo .Rmd, puedes desarrollar análisis reproducibles y generar informes profesionales en formatos como HTML, PDF o Word, sin necesidad de copiar gráficos ni resultados manualmente.
Creación de un nuevo archivo R Markdown
Para comenzar a trabajar con R Markdown desde RStudio, sigue estos pasos iniciales:
- Abre RStudio.
- Haz clic en Archivo → Nuevo archivo → R Markdown…
- Se abrirá una ventana donde puedes definir el título del informe, autor y formato de salida (HTML, PDF o Word).
- Presiona OK. RStudio generará automáticamente una plantilla básica con el formato correcto.
El contenido inicial del documento tendrá una estructura como la siguiente:
---
title: "Informe de Sistemas de Ecuaciones"
author: "Nombre del Estudiante"
output: html_document
---
## Introducción
Este informe presenta la resolución de sistemas lineales en R.
Aquí podemos mostrar cómo resolvemos el sistema de ecuaciones
$$
\begin{array}{rl}
2x + y &=5 \\
x+3y &= 7
\end{array}
$$
utilizando las funcionalidades de R, como la formulación matricial:
```{r}
# Sistema simple
A <- matrix(c(2, 1,
1, 3), nrow = 2)
B <- c(5, 7)
sol <- solve(A, B)
sol
```
Y luego, con esto, sus resultados:
$$
\begin{array}{rl}
x &=`r round(sol[1],3)` \\
y &=`r round(sol[2],3)`
\end{array}
$$¿Qué es el botón Knit?
Una vez que tienes tu archivo .Rmd listo, puedes generar el informe completo haciendo clic en el botón Knit. Este botón se encuentra en la parte superior del script, dentro de la barra de herramientas del editor, y tiene el siguiente ícono:
🧶 Knit
Al hacer clic en él, RStudio ejecuta automáticamente todo el código incluido en los chunks del documento, inserta los resultados y genera un archivo final en el formato especificado (por ejemplo, HTML).
También puedes usar el atajo de teclado Ctrl + Shift + K (o Cmd + Shift + K en Mac) para compilar rápidamente el informe.
Componentes principales de un archivo .Rmd
Todo documento R Markdown se compone de tres partes esenciales:
- Encabezado YAML: define metadatos del informe y su formato de salida
- Texto formateado: permite redactar introducciones, interpretaciones y conclusiones
- Chunks de código: bloques ejecutables donde se escriben instrucciones en R
Formatos de salida disponibles
El formato del informe se determina en la línea output: del encabezado YAML. Puedes elegir entre:
html_document: visualizable en navegadorpdf_document: ideal para impresión y presentaciónword_document: editable en Microsoft Word
Elementos de formato en el texto
R Markdown permite dar formato al texto con una sintaxis sencilla. Desde RStudio puedes escribir:
- Encabezados:
#,##,### - Listas:
-o* - Énfasis:
*cursiva*,**negrita**,`código` - Tablas: usando
|y separadores con--- - Imágenes:

Chunks de código en RStudio
Los chunks de código son bloques especiales donde puedes escribir instrucciones en R. Se insertan con el atajo Ctrl + Alt + I o desde el botón Insert en la barra superior del editor.
Ejemplo básico de chunk:
```{r} x <- 10 y <- 5 x + y ``` Chunks con opciones:
Puedes controlar el comportamiento de cada chunk con opciones internas como:
echo = FALSE: oculta el código y muestra solo el resultadoeval = FALSE: no ejecuta el código (ideal para mostrar ejemplos)message = FALSE,warning = FALSE: suprime mensajes y advertencias
Ejemplo con opciones:
```{r, echo=FALSE, warning=FALSE} plot(1:10, 1:10, main = "Gráfico de ejemplo") ``` Compilación y exportación del informe
- Guarda el archivo con extensión
.Rmd - Haz clic en el botón Knit (parte superior del script)
- Selecciona el formato de salida deseado (HTML, PDF o Word)
- RStudio generará automáticamente un documento final con texto, código y resultados integrados
Estructura de un Informe Técnico Automatizado
Un informe técnico automatizado en R Markdown debe presentar no solo contenido preciso, sino también una estructura clara y profesional. Esta sección enseña cómo organizar un documento .Rmd utilizando títulos jerárquicos, tablas de contenido automáticas, formato de texto, listas, tablas e inserción de imágenes.
Encabezados y organización de secciones
Los encabezados se crean con el símbolo #, indicando el nivel jerárquico de cada sección. Esto permite al lector identificar claramente la estructura del documento.
# Título principal ## Sección 1 ### Subsección 1.1 #### Nivel 4
Puedes usar hasta seis niveles de encabezado. En informes técnicos se recomienda no pasar del nivel 3.
Activar índice automático
Para mostrar una tabla de contenido navegable al inicio del informe, añade estas opciones en el encabezado YAML del documento:
output:
html_document:
toc: true
toc_depth: 2
number_sections: true
toc: truemuestra el índice.toc_depth: 2incluye hasta el segundo nivel de encabezado.number_sections: truenumera automáticamente los títulos.
Formato básico del texto
R Markdown permite dar formato al texto con una sintaxis simple:
*cursiva*→ cursiva**negrita**→ negrita`código`→código
Listas
Listas con viñetas:
- Primer elemento - Segundo elemento - Subnivel
Listas numeradas:
1. Paso uno 2. Paso dos 3. Paso tres
Separadores y saltos de línea
- Para una línea horizontal usa:
--- - Para un salto de línea, deja dos espacios al final de la línea anterior o escribe
<br>.
Tablas simples
Las tablas se crean usando barras verticales | y guiones para separar encabezados:
| Variable | Valor | |----------|-------| | A | 10 | | B | 25 |
Inserción de imágenes
Para agregar una imagen desde un archivo local:

También puedes definir el ancho con HTML:
<img src="ruta/imagen.png" width="300px">
Notas al pie y citas bibliográficas
Las notas al pie se crean con: Palabra[^1] y luego defines al final: [^1]: Esta es la nota.
Para citas académicas, usa un archivo .bib y escribe: [@autor2023].
Fragmento de ejemplo completo
---
title: "Informe Automatizado"
author: "Nombre del Autor"
output:
html_document:
toc: true
toc_depth: 2
number_sections: true
---
# Introducción
Este documento ejemplifica la estructura de un informe técnico en R Markdown.
## Objetivos
- Presentar la sintaxis de encabezados
- Activar tabla de contenido
- Usar listas y tablas
## Tabla de ejemplo
| Elemento | Valor |
|----------|-------|
| X | 5 |
| Y | 8 |
## Imagen referencial

## Conclusión
Organizar correctamente un informe mejora su legibilidad, facilita su mantenimiento y permite automatizar su producción en distintos contextos.
Resolución de Sistemas de Ecuaciones en R
En esta sección se documenta la resolución de un sistema de ecuaciones aplicado a un problema de distribución social. El objetivo no es solo resolverlo, sino generar un informe reproducible y profesional usando R Markdown.
Problema resuelto: distribución de ayuda humanitaria
Una organización comunitaria dispone de 1.200 kg de alimentos no perecibles para distribuir entre tres sectores vulnerables: Sector A, Sector B y Sector C.
Las condiciones de reparto son:
- El Sector A no puede recibir más de 500 kg.
- El Sector B debe recibir el doble que el Sector C.
- La suma de lo que recibe el Sector A y el Sector C debe ser igual a lo que recibe el Sector B.
- La carga total es de 1.200 kg.
¿Cuántos kilogramos deben asignarse a cada sector para cumplir con todas las condiciones?
Resolución en R Markdown
---
title: "Distribución de Ayuda Humanitaria"
author: "Nombre del estudiante"
output: html_document
---
## Introducción
Una organización comunitaria dispone de 1.200 kg de alimentos no perecibles para distribuir entre tres sectores vulnerables: Sector A, Sector B y Sector C.
Las condiciones de reparto son:
El Sector A no puede recibir más de 500 kg.
El Sector B debe recibir el doble que el Sector C.
La suma de lo que recibe el Sector A y el Sector C debe ser igual a lo que recibe el Sector B.
La carga total es de 1.200 kg.
¿Cuántos kilogramos deben asignarse a cada sector para cumplir con todas las condiciones?
## Formulación del sistema
Denotamos con:
- <code>a</code>: cantidad en kg asignada al Sector A
- <code>b</code>: cantidad en kg asignada al Sector B
- <code>c</code>: cantidad en kg asignada al Sector C
Las condiciones se traducen en el siguiente sistema:
$$
\begin{array}{rl}
a + b + c &= 1200 \quad \text{(suma total)} \\
b &= 2c \quad \text{(el sector B recibe el doble que el C)} \\
a + c &= b \quad \text{(A más C igual a B)}
\end{array}
$$
## Resolución del sistema
```{r}
A <- matrix(c(1, 1, 1,
0, 1, -2,
1, -1, 1),
nrow = 3, byrow = TRUE)
B <- c(1200, 0, 0)
sol <- solve(A, B)
names(sol) <- c("a", "b", "c")
sol
```
La solución del problema es:
$Sector A = `r round(sol["a"],3)`$
$Sector B = `r round(sol["b"],3)`$
$Sector C = `r round(sol["c"],3)`$
Visualización geométrica del sistema: intersección de planos
Retomando el problema de distribución de ayuda humanitaria, recordemos que llegamos a un sistema de tres ecuaciones con tres incógnitas:
$$
\begin{array}{rl}
a + b + c &= 1200 \quad \text{(suma total)} \\
b &= 2c \quad \text{(el sector B recibe el doble que el C)} \\
a + c &= b \quad \text{(A más C igual a B)}
\end{array}
$$
Cada una de estas ecuaciones representa un plano en el espacio tridimensional. La solución del sistema (los valores de a, b y c) se encuentra en el punto donde estos tres planos se intersectan.
Visualización 3D con plotly
```{r, message=FALSE, warning=FALSE}
library(plotly)
# Secuencias para generar la grilla
a_seq <- seq(0, 600, length.out = 30)
c_seq <- seq(0, 600, length.out = 30)
# Crear grilla
a_grid <- matrix(rep(a_seq, each = length(c_seq)), nrow = length(c_seq))
c_grid <- matrix(rep(c_seq, times = length(a_seq)), nrow = length(c_seq))
# Ecuaciones transformadas en superficies (z = b)
P1_b <- 1200 - a_grid - c_grid # Plano 1: a + b + c = 1200
P2_b <- 2 * c_grid # Plano 2: b = 2c
P3_b <- a_grid + c_grid # Plano 3: b = a + c
# Coordenadas del punto solución
sol <- c(a = 300, b = 600, c = 300)
# Curva intersección entre plano 2 y 3: b = 2c y b = a + c => 2c = a + c => a = c
intersec_23_c <- seq(0, 600, length.out = 100)
intersec_23_a <- intersec_23_c
intersec_23_b <- 2 * intersec_23_c
# Curva intersección entre plano 1 y 3: a + b + c = 1200 y b = a + c
# Sustituimos b en la primera: a + (a + c) + c = 1200 => 2a + 2c = 1200 => a + c = 600
intersec_13_a <- seq(0, 600, length.out = 100)
intersec_13_c <- 600 - intersec_13_a
intersec_13_b <- intersec_13_a + intersec_13_c
# Crear figura con planos, curvas de intersección y punto
fig <- plot_ly(showscale = FALSE) %>%
# Planos
add_surface(x = ~a_grid, y = ~c_grid, z = ~P1_b,
opacity = 0.6, colorscale = list(c(0,1),c("skyblue","skyblue")),
name = "a + b + c = 1200") %>%
add_surface(x = ~a_grid, y = ~c_grid, z = ~P2_b,
opacity = 0.6, colorscale = list(c(0,1),c("lightgreen","lightgreen")),
name = "b = 2c") %>%
add_surface(x = ~a_grid, y = ~c_grid, z = ~P3_b,
opacity = 0.6, colorscale = list(c(0,1),c("salmon","salmon")),
name = "a + c = b") %>%
# Punto solución
add_markers(x = ~sol["a"], y = ~sol["c"], z = ~sol["b"],
marker = list(size = 6, color = "red"),
name = "Solución (300, 600, 300)") %>%
# Intersección P2 y P3 (a = c)
add_lines(x = ~intersec_23_a, y = ~intersec_23_c, z = ~intersec_23_b,
line = list(color = "black", width = 4, dash = "dash"),
name = "Intersección: P2 ∩ P3") %>%
# Intersección P1 y P3 (a + c = 600)
add_lines(x = ~intersec_13_a, y = ~intersec_13_c, z = ~intersec_13_b,
line = list(color = "purple", width = 4, dash = "dot"),
name = "Intersección: P1 ∩ P3") %>%
layout(scene = list(
xaxis = list(title = "a (Sector A)"),
yaxis = list(title = "c (Sector C)"),
zaxis = list(title = "b (Sector B)")),
title = "Visualización geométrica del sistema: Intersección de planos"
)
fig
```
Puedes girar, acercar y alejar la vista para observar cómo los planos se cruzan en un único punto: ese punto es la solución del sistema, y representa la distribución óptima de los recursos. Esta visualización no solo ilustra el resultado, sino que refuerza la comprensión geométrica de los sistemas de ecuaciones lineales.
Desafío propuesto: distribución de materiales educativos
Una organización internacional desea distribuir 1.500 kits escolares entre tres comunidades rurales: Comunidad X, Comunidad Y y Comunidad Z.
Las condiciones del reparto son las siguientes:
- La Comunidad X no puede recibir más de 400 kits.
- La Comunidad Y debe recibir exactamente el triple de lo que reciba la Comunidad Z.
- La suma de lo que reciban la Comunidad X y la Comunidad Z debe ser igual a lo que reciba la Comunidad Y.
- El total disponible para repartir es de 1.500 kits.
¿Cuántos kits deben asignarse a cada comunidad para cumplir con todas las condiciones?
Instrucciones:
Resuelve este problema paso a paso utilizando un documento R Markdown. Asegúrate de que tu informe contenga:
- Una introducción clara del problema en lenguaje natural.
- La formulación algebraica del sistema de ecuaciones con definición de variables.
- La resolución del sistema en R utilizando matrices y la función
solve(). - Una interpretación de los resultados en contexto.
- (OPCIONAL) Una visualización tridimensional del sistema, donde cada ecuación sea representada como un plano, y se incluya el punto solución.
- Un documento bien estructurado y formateado, usando encabezados, listas, ecuaciones y fragmentos de código.
Recuerda que tu informe debe ser exportado en formato .HTML y contener tanto el código como los resultados y explicaciones. Puedes usar como guía el ejemplo resuelto en esta clase.
