Información básica sobre el taller

En la era de los datos masivos, integrar los flujos de trabajo de análisis en las publicaciones científicas es esencial para garantizar la transparencia, accesibilidad y reproducibilidad. Compartir el flujo de trabajo de investigación puede ayudar a documentar las decisiones tomadas, el código analítico final utilizado en el análisis y los parámetros seleccionados. Constituye así una herramienta valiosa, tanto para usted mismo como para sus colegas, contribuyendo a promover una ciencia abierta.

Hoy en día, existe un interés creciente por la transparencia y la reproducibilidad de las publicaciones científicas. Esto es debido a que analizar datos brutos de estudios anteriores puede convertirse en un ejercicio de “bioinformática forense”: resulta muy complicado reconstruir el camino entre los datos brutos publicados y los resultados presentados en los artículos.

Objetivo

Este material docente se basa en el taller “Rapports de recherche reproductibles et interactifs avec R Markdown pour écologistes”, impartido el 27 de mayo de 2026 en la Universidad Laval. Su objetivo es introducir el uso de R Markdown para la creación de informes reproducibles e interactivos para comunicar los resultados de sus investigaciones. A lo largo del documento se presentan herramientas básicas para integrar texto, código, resultados, tablas y gráficos en un mismo informe. También se incluyen ejemplos de uso de los paquetes tidyverse, ggplot2, DT y otros paquetes asociados.

Cómo utilizar este material

Este documento está concebido como una guía práctica para iniciarse en la creación de informes reproducibles e interactivos con R Markdown. Puede utilizarse de forma autónoma, siguiendo las secciones en orden, o como material de apoyo en actividades docentes relacionadas con el análisis de datos, la reproducibilidad y la comunicación científica.

Se recomienda comenzar por las secciones introductorias sobre R Markdown, la sintaxis Markdown y los bloques de código. A continuación, pueden ejecutarse progresivamente los ejemplos propuestos para explorar datos, generar tablas interactivas, crear visualizaciones (estáticas y interactivas) y presentar resultados de análisis.

R Markdown

Este es un documento R Markdown. Markdown es un lenguaje de marcado sencillo con una sintaxis de formato simple que permite dar formato al texto y crear documentos en HTML, PDF o MS Word. Para más detalles sobre el uso de R Markdown, puede consultar la página oficial: http://rmarkdown.rstudio.com.

Librería rmarkdown

R Markdown, a través del paquete rmarkdown, es una herramienta que le permite crear informes dinámicos que integran los datos de entrada, los análisis realizados, así como el código, los resultados generados (como gráficos y tablas), y el texto que contextualiza los análisis e interpreta los resultados.

¿Cómo funciona R Markdown?

R Markdown combina texto redactado en Markdown (un lenguaje de marcado sencillo) con código R. De este modo, el informe se escribe en un solo archivo .Rmd que contiene tanto sus explicaciones como sus análisis.

Esto permite:

  • Documentar cada paso de su análisis,

  • Actualizar automaticamente los resultados si cambian los datos,

  • Producir informes profesionales, reproducibles y fáciles de compartir.

Al hacer clic en el botón “Knit” en RStudio, R Markdown ejecuta el código R, inserta los resultados (como tablas, gráficos o valores numéricos) en el documento y luego convierte todo en un solo archivo, en formato HTML, PDF, Word, PowerPoint. Esta estructura le permite concentrarse en el contenido del informe, mientras R Markdown se encarga de generar el documento final. En otras palabras, usted aporta sus datos, su código y sus ideas, y R Markdown produce un informe que puede utilizarse para:

• Realizar análisis de datos de manera interactiva en el entorno RStudio,

• Reproducir sus análisis,

• Colaborar y compartir código con otras personas,

• Comunicar sus resultados.

Logotipo del Centre d’étude de la forêt (CEF)
Logotipo del Centre d’étude de la forêt (CEF)

Bloques de código (Chunks)

En un documento R Markdown, los bloques de código, también llamados chunks, permiten integrar código (por ejemplo, en R o Python) directamente ejecutar este dentro del documento R Markdown. Este código puede ejecutarse para analizar datos, producir texto, tablas o gráficos.

Inserción y opciones de los bloques de código (Chunks)

Los chunks pueden añadirse en su archivo R Markdown de varias maneras:

  • a través del atajo de teclado Ctrl + Alt + I para Windows o Cmd + Option + I en Mac

  • haciendo clic en “Add Chunk” en la barra de herramientas del editor

  • o escribiendo manualmente los delimitadores de chunk

code = "bienvenido al taller de R Markdown"

Al generar el documento final de su archivo .Rmd, R Markdown ejecuta cada chunk e incorpora sus los resultados en el informe final.

Opciones de chunks

Cada chunk está enmarcado por etiquetas especiales y puede configurarse con diferentes opciones (llamadas chunk options), que permiten controlar qué elementos se muestran en el documento final. Estas opciones se escriben entre las llaves del encabezado del chunk. Por ejemplo: {r nom_de_chunk, echo = FALSE, message = FALSE}.

Algunas opciones utilizadas comúnmente:

  • include = FALSE: el códico se ejecuta, pero no se muestran ni el código, ni los resultados en el documento final. Esto permite, por ejemplo, realizar cálculos preparatorios sin mostrarlos.

  • echo = FALSE: el código no se muestra, pero los resultados son visibles. Ideal para insertar figuras sin mostrar el código de creación.

  • message = FALSE: oculta los mensajes generados por el código, como los mensajes de carga de paquetes.

  • warning = FALSE: oculta las advertencias.

  • fig.cap = “…”: añade una leyenda a una figura insertada.

Para consultar todas las opciones disponibles, puede referirse a la guía oficial: R Markdown https://bookdown.org/yihui/rmarkdown/r-code.html#r-code

Estas opciones permiten adaptar el informe al público destinatario. En un informe dirigido a colegas o colaboradores técnicos, puede ser útil mostrar tanto el código y como los resultados para asegurar la reproducibilidad de su flujo de trabajo. En cambio, en un informe dirigido a un público no técnico (ej.: tomadores de decisiones, empresas), puede ser preferible ocultar el código y mostrar únicamente los resultados y sus interpretaciones.

Buenas prácticas

Se recomienda asignar un nombre claro a cada chunk para facilitar la organización y navegación en su documento .Rmd.

Atención: es importante no repetir nombres de chunks. Si dos chunks tienen el mismo nombre, el documento final no se generará indicando un error.

1. Bases y sintaxis Markdown

Formato de texto, imágenes e hipervínculos R Markdown le permite escribir texto con formato e integrar elementos dinámicos como imágenes, enlaces y resultados de análisis. A continuación se presentan algunas funciones básicas:

Texto

Markdown permite dar formato al texto mediante una sintaxis sencilla. Por ejemplo:

- *cursiva*
- **negrita**
- superscript^2^ and subscript~2~
- bienvenido al taller de R Markdown
- ![Texto alternativo](assets/CEFLogo.png)
- [19e Colloque CEF](https://cef-cfr.uqam.ca/colloque/2026/index.php?userlang=_fr#services)
  • cursiva → produce texto en cursiva

  • negrita → produce texto en negrita

  • km2: permite escribir superíndices y subíindices

  • bienvenido al taller de R Markdown: permite insertar código R en la línea de texto

  • ![Texto alternativo](ruta/de/la/imagen.png): permite insertar una imagen

  • 19e Colloque CEF: Permite insertar un hipervínculo

Títulos

Los títulos se definen con el símbolo #. El número de símbolos indica el nivel jerárquico del título:

# Título 1
## Título 2
### Título 3
#### Título 4
  • Título principal

  • Subtítulo (sección)

  • Intertítulo (subsección)

  • Sub-intertítulo

Listas:

Markdown permite crear listas con viñetas o listas numeradas:

  • o * para listas con viñetas

1., 2. para listas numeradas

Creación de informes interactivos con R Markdown

R Markdown no se limita a la creación de informes estáticos. También permite generar informes interactivos, que son particularmente útiles para la exploración de datos, la visualización dinámica y la comunicación científica atractiva. Gracias a ciertos paquetes como leaflet, se puede integrar fácilmente mapas interactivos directamente en sus documentos HTML.

Mapas interactivos

library(dplyr)
library(leaflet)
leaflet() %>% 
  setView(-71.27609, 46.77931,  zoom = 17)%>% 
  addTiles()%>% 
addPopups(-71.2755, 46.779, 'Salle "PLT-2573"')

En el ejemplo anterior se encuentra un mapa interactivo con la ubicación del taller durante el coloquio del CEF 2026. Estos mapas permiten a los lectores ampliar, desplazar el mapa, hacer clic en marcadores o incluso mostrar capas de información adicional. Es una funcionalidad potente para presentar datos geográficos o espaciales, en particular en áreas como la ecología, la biogeografía, la salud pública o las ciencias sociales.

2. Informe de ejemplo

Paquetes R

Este no es un taller exhaustivo sobre los paquetes de R, pero aquí proporcionamos los enlaces de los paquetes esenciales para crear informes de investigación eficaces con R Markdown. Recomendamos instalarlos antes de empezar a crear el informe.

# paquete para los conjuntos de datos
#install.packages("vegan")# Si aún no ha instalado el paquete
library(vegan)# para cargar los datos BCI

# paquete para las tablas
#install.packages("dplyr") # Si aún no ha instalado el paquete
library(dplyr)
#install.packages("tidyverse") # Si aún no ha instalado el paquete
library(tidyverse)# El tidyverse es una colección de paquetes R orientada a la ciencia de los datos.

#install.packages("remotes")# Si aún no ha instalado el paquete
#remotes::install_github('rstudio/DT')# Si aún no ha instalado el paquete
library(DT)
#install.packages("gt") # Si aún no ha instalado el paquete
library(gt)
#install.packages("broom.mixed") # Si aún no ha instalado el paquete
library(broom.mixed)# Convertir objetos que resultan de modelos mixtos en R, al igual que el paquete 'broom'.

# paquete de gráficos y figuras
#install.packages("ggplot2")# Si aún no ha instalado el paquete
library(ggplot2)
#install.packages("ggpubr")# Si aún no ha instalado el paquete
library(ggpubr)
#install.packages("plotly") # Si aún no ha instalado el paquete
library(plotly)

# paquete para la generación de mapas interactivos
#install.packages("leaflet") # Si aún no ha instalado el paquete
library(leaflet)

# paquete para los análisis estadísticos
#install.packages("lme4") # Si aún no ha instalado el paquete
#install.packages("lmerTest") # Si aún no ha instalado el paquete
library(lme4)
library(lmerTest)
# paquete para la generación de informes dinámicos con R
library(knitr)

Conjunto de datos de práctica

En esta sección, utilizaremos un conjunto de datos de ejemplo para ilustrar cómo construir un informe dinámico con R Markdown. Se trata de un conjunto de datos sencillo, que permitirá familiarizarse con las principales etapas de creación de un informe.

Utilizaremos el paquete fgeo para analizar datos como indicadores de la diversidad y la dinámica del bosque tropical de Puerto Rico.

El paquete fgeo permite instalar, cargar y consultar la documentación de varios paquetes relacionados con el análisis de datos ForestGEO, como fgeo.analyze, fgeo.plot, fgeo.tool, fgeo.x. Esta colección de paquetes permite manipular y representar gráficamente los datos de inventarios forestales, así como realizar análisis comunes sobre la abundancia, la demografía y las asociaciones especies-hábitats.

#paquete para trabajar con datos forestales ForestGeo
#install.packages("fgeo")
library(fgeo)

Mapa interactivo del sitio de estudio forestal: localización del sitio de investigación ecológica a largo plazo de Luquillo en Puerto Rico (conjunto de datos de ejemplo)

leaflet() %>% 
  setView(-65.816000000000, 18.326200000000, zoom = 8)%>% 
  addTiles()%>% 
addPopups(-65.81, 18.32, 'Aquí está <b>Luquillo Long Term Ecological Research</b>')

Acceder y manipular datos

la función example_path() le permite acceder a los conjuntos de datos almacenados en sus bibliotecas R.

example_path()
##  [1] "csv"           "mixed_files"   "rdata"         "rdata_one"    
##  [5] "rds"           "taxa.csv"      "tsv"           "vft_4quad.csv"
##  [9] "view"          "weird"         "xl"
#>  [1] "csv"           "mixed_files"   "rdata"         "rdata_one"    
#>  [5] "rds"           "taxa.csv"      "tsv"           "vft_4quad.csv"
#>  [9] "view"          "weird"         "xl"

(vft_file <- example_path("view/vft_4quad.csv"))
## [1] "C:/Users/Marta/AppData/Local/R/win-library/4.6/fgeo.x/extdata/view/vft_4quad.csv"
# Datos para la práctica
luquillo.data <- read_vft(vft_file)

Datos Luquillo: Un conjunto de datos con 16 parcelas (filas) de 1 hectárea, con conteos de árboles en cada parcela, para un total de 37 especies (columnas).

El conjunto de datos Luquillo del paquete fgeo proviene del bosque experimental de Luquillo, en Puerto Rico, un sitio de investigación forestal tropical permanente que forma parte de la red ForestGEO. Este conjunto de datos contiene información de censo forestal realizados en una parcela permanente de 16 ha. Esta parcela fue establecida para seguir la dinámica, la biodiversidad, el reclutamiento, la mortalidad, y las respuestas a las perturbaciones como huracanes y sequías en los bosques tropicales.

En el entorno fgeo, los conjuntos de datos Luquillo incluyen:

  • los censos de árboles y tallos,

  • la identificación de las especies,

  • las medidas del diámetro a la altura del pecho (DHP),

  • las coordenadas espaciales,

  • información sobre el hábitat y la altitud,

  • censos repetidos a lo largo del tiempo.

Visualización de los datos

luquillo.data

El objeto luquillo.data es un dataframe tibble importado del paquete fgeo, es decir, una versión moderna de un data.frame utilizada habitualmente en el tidyverse. Funciona de manera similar a un data.frame clásico, pero ofrece una visualización más clara y una mejor integración con funciones de manipulación de datos. Una forma sencilla de inspeccionar el contenido inicial del conjunto de datos es utilizar la función head ():

head(luquillo.data)
## # A tibble: 6 × 32
##    DBHID PlotName PlotID Family  Genus SpeciesName Mnemonic Subspecies SpeciesID
##    <int> <chr>     <int> <chr>   <chr> <chr>       <chr>    <chr>          <int>
## 1 385164 luquillo      1 Rubiac… Psyc… brachiata   PSYBRA   <NA>             185
## 2 385261 luquillo      1 Urtica… Cecr… schreberia… CECSCH   <NA>              74
## 3 384600 luquillo      1 Rubiac… Psyc… brachiata   PSYBRA   <NA>             185
## 4 608789 luquillo      1 Rubiac… Psyc… berteroana  PSYBER   <NA>             184
## 5 388579 luquillo      1 Arecac… Pres… acuminata   PREMON   <NA>             182
## 6 384626 luquillo      1 Aralia… Sche… morototoni  SCHMOR   <NA>             196
## # ℹ 23 more variables: SubspeciesID <chr>, QuadratName <chr>, QuadratID <int>,
## #   PX <dbl>, PY <dbl>, QX <dbl>, QY <dbl>, TreeID <int>, Tag <chr>,
## #   StemID <int>, StemNumber <int>, StemTag <int>, PrimaryStem <chr>,
## #   CensusID <int>, PlotCensusNumber <int>, DBH <dbl>, HOM <dbl>,
## #   ExactDate <date>, Date <int>, ListOfTSM <chr>, HighHOM <int>,
## #   LargeStem <chr>, Status <chr>

Esta función muestra las primeras filas del objeto y permite obtener una primera idea de sus variables. Sin embargo, para conjuntos de datos con muchas filas o columnas, esta visualización puede resultar limitada.

Tablas interactivas

El paquete DT permite crear tables interactivas en documentos HTML mediante la función DT::datatable() para visualizar los datos R a través del paquete DataTables (no confundir con el paquete data.table). Estas tablas facilitan la exploración de los datos directamente en el informe, sin necesidad de ejecutar código adicional.

Las ventajas de incluir DT::datatable() en su flujo de trabajo R Markdown son:

  • Permite filtrar, ordenar y buscar directamente en el informe. Ideal para grandes conjuntos de datos donde las tablas estáticas son difíciles de leer o navegar.

  • Mejora la navegación de los usuarios y hace que los informes sean más dinámicos y amigables. Los lectores (por ejemplo, colaboradores, supervisores) pueden interactuar con los datos sin ejecutar código. Usted puede personalizar fácilmente: el número de líneas mostradas, la visibilidad de las columnas o el estilo condicional.

  • Funciona bien con las salidas R Markdown basadas en HTML (por ejemplo, html_document, flexdashboard, bookdown). Este diseño se adapta al tamaño de la pantalla en HTML.

Este tipo de tablas puede ser útil, por ejemplo:

• Presentar listas de especies,

• Buscar muestras por ID o característica.

• Preparar tablas recapitulativas con estadísticas agrupadas (promedios, desviaciones estándar, conteos).

• Verificar datos (por ejemplo, detección de valores atípicos, valores faltantes o missing-data).

• Elaborar inventarios interactivos para el trabajo de campo o estudios de biodiversidad.

Presentar sus datos: R base vs. paquete DT

En R existen distintas formas de explorar y presentar un conjunto de datos. Entre los enfoques más comunes, se encuentran:

str(): una función de base R que muestra la estructura interna de un objeto (tipo, dimensiones, clases, etc.). Es particularmente útil para una inspección rápida de la composición de un conjunto de datos.

La visualización directa de un data.frame() en la consola o en un informe RMarkdown muestra las primeras líneas de sus datos en forma tabular.

El paquete DT, por otro lado, permite crear tablas interactivas en los informes HTML, facilitando la navegación y la exploración.

DT::datatable(luquillo.data)
Comparación de los métodos de presentación de datos
Método Ventajas Desventajas
str() ✅ Muy rápido de ejecutar
✅ Ideal para entender la estructura global
❌ Visualización no interactiva
❌ No muestra resumen estadístico
print(data.frame) ✅ Simple e inmediato
✅ Representación fiel de los datos
❌ Poco legible para grandes conjuntos de datos
❌ No interactivo
DT::datatable() ✅ Interactivo: ordenar, filtrar, buscar
✅ Personalizable
✅ Legibilidad mejorada
❌ Funciona únicamente con salidas HTML
❌ Menos útil para PDF o Word

En conclusión, utilizar DT en sus informes HTML permite ofrecer una experiencia de usuario rica y atractiva, mientras que las funciones de base como str() o la impresión directa son más adecuadas para una exploración técnica rápida.

3. Manipulación y visualización de los datos

dplyr 1.1.4

El uso de un flujo de trabajo completamente basado en dplyr suele facilitar la claridad y la reproducibilidad de los análisis, especialmente en el contexto de R Markdown y de los informes de análisis de datos. En la elaboración de informes de investigación reproducibles, el uso de dplyr no es solo una cuestión de estilo, sino también ayuda a organizar el razonamiento analítico y a comunicar de forma más clara el proceso seguido con los datos. Una de sus principales ventajas es que permite elaborar en secuencia las operaciones de manera lógica sin crear numerosos objetos intermedios en el entorno R. Esto reduce el riesgo de errores, aligera la memoria y facilita la trazabilidad de las etapas de análisis. Por el contrario, un flujo de trabajo basado en múltiples objetos intermedios, especialmente si no están bien nombrados, puede dificultar la comprensión, el mantenimiento y el intercambio de códigos.

# Crear la tabla resumen en forma de tibble
resume_tbl <- tibble::tibble(
  Problema = c(
    "Legibilidad", "Depuración", "Reutilizabilidad",
    "Colaboración", "Integración en los informes"
  ),
  `Base R / Sin dplyr` = c(
    "❌ A menudo desordenado", "❌ Difícil", "❌ Baja",
    "❌ Difícil de seguir", "❌ Trabajo manual"
  ),
  `Estilo dplyr` = c(
    "✅ Claro y lineal", "✅ Pasos trazables", "✅ Elevada",
    "✅ Estándar comunitario", "✅ Fluido"
  )
)

# Mostrar la tabla con knitr::kable
knitr::kable(resume_tbl, caption = "Comparación entre los flujos de trabajo en base R y en dplyr")
Comparación entre los flujos de trabajo en base R y en dplyr
Problema Base R / Sin dplyr Estilo dplyr
Legibilidad ❌ A menudo desordenado ✅ Claro y lineal
Depuración ❌ Difícil ✅ Pasos trazables
Reutilizabilidad ❌ Baja ✅ Elevada
Colaboración ❌ Difícil de seguir ✅ Estándar comunitario
Integración en los informes ❌ Trabajo manual ✅ Fluido
Comparación entre los flujos de trabajo en base R y en dplyr
Problema Base R / Sin dplyr Estilo dplyr
Legibilidad ❌ A menudo desordenado ✅ Claro y lineal
Depuración ❌ Difícil ✅ Pasos trazables
Reutilizabilidad ❌ Baja ✅ Elevada
Colaboración ❌ Difícil de seguir ✅ Estándar comunitario
Integración en los informes ❌ Trabajo manual ✅ Fluido

Exploración de los datos con DT y dplyr

La combinación de los paquetes dplyr y DT, permite explorar y resumir eficazmente los datos forestales. En esta sección, utilizamos el conjunto de datos Luquillo, incluido en el paquete fgeo, que contiene información de censo forestal procedentes del bosque tropical en Puerto Rico. El objetivo es calcular el número de individuos por especie, por censo y por estado de los árboles mediante el flujo de trabajo dplyr, y presentar posteriormente los resultados en una tabla interactiva con DT en un informe R Markdown.

library(dplyr)

species_summary <- luquillo.data %>%
  group_by(PlotCensusNumber, Mnemonic, Status) %>%
  summarise(
    n_individuals = n_distinct(TreeID),
    .groups = "drop"
  ) %>%
  arrange(PlotCensusNumber, Mnemonic)

DT::datatable(species_summary)

Para facilitar la exploración de los resultados, los datos resumidos también pueden transformarse en una tabla ancha (wide table), donde cada estado del árbol aparece en una columna distinta. Esta estructura permite comparar rápidamente el número de individuos vivos, muertos o que tienen otros estados entre las especies y los diferentes censos. El uso de tidyr con la función pivot_wider() mejora así la legibilidad y la interpretación de los resultados y facilita la interpretación de los resultados en los informes interactivos.

library(tidyr)

species_wide <- species_summary %>%
  pivot_wider(
    names_from = Status,
    values_from = n_individuals,
    values_fill = 0
  )

DT::datatable(species_wide)

4. Gráficos y visualizaciones interactivas

La visualización gráfica es un aspecto central del análisis de los datos. En R, los gráficos pueden generarse utilizando varias funciones, incluyendo aquellas de R base y paquetes especializados como ggplot2. En esta sección, exploraremos cómo incluir tanto gráficos estáticos e interactivos en un informe R Markdown.

Preparación de los datos y estimación del índice de Shannon

El siguiente código de arriba calcula la riqueza específica para cada subparcela y cada censo del conjunto de datos luquillo.data, considerando únicamente los individuos vivos (Status == “alive”).

La función group_by() permite agrupar los datos por censo (PlotCensusNumber) y por subparcela (QuadratName), mientras que summarise() calcula el número de especies distintas en cada grupo. Finalmente, mutate() transforma la variable PlotCensusNumber en factor y asocia los niveles 4, 5 y 6 a los años de censo 2006, 2012 y 2016, respectivamente.

diversity_subplot <- luquillo.data %>%
                     filter(Status == "alive") %>%
                     group_by(PlotCensusNumber, QuadratName) %>%
                              summarise(richness = n_distinct(Mnemonic),
                                        .groups = "drop") %>%
                    mutate(CensusYear = factor(
                           PlotCensusNumber,
                           levels = c(4, 5, 6),
                           labels = c("2006", "2012", "2016")))

Gráficos

Gráficos con R base

R base ofrece una gama de funciones sencillas para crear gráficos que pueden integrarse fácilmente en un documento R Markdown. Estas funciones son útiles como punto de partida para las tareas de visualización.

Por ejemplo, función plot() de R base permite representar la riqueza específica de las subparcelas en los distintos años de censo:

boxplot(diversity_subplot$richness~as.factor(diversity_subplot$CensusYear),xlab = "Census Year", ylab = "Tree species richness")

Figuras de alta calidad con los paquetes ggplot2 3.5.1 y ggpubr 0.6.3

Aunque las funciones de trazado de R base son útiles, ggplot2 es un paquete más flexible y potente que permite crear gráficos más elaborados y personalizables para su publicación. Este paquete se basa en la “Gramática de los gráficos”, lo que le permite construir una figura de forma progresiva mediante la incorporación de capas, como por ejemplo, puntos, líneas, etiquetas o elementos estadísticos, a un objeto de gráfico base. Además, el paquete ggpubr ofrece funciones fáciles de usar para personalizar el gráfico generado con ggplot2 y prepararlo para su publicación.

Para utilizar ggplot2 en su informe, primero debe cargar el paquete (asegúrese de haberlo instalado previamente):

my_comparisons <- list(
  c("2006", "2012"),
  c("2006", "2016"),
  c("2012", "2016"))

p <- ggplot(diversity_subplot,
       aes(x = CensusYear,
           y = richness)) +
  geom_boxplot() +
  geom_jitter(width = 0.2, alpha = 0.5) +
  stat_summary(fun = mean,
    geom = "point",
    shape = 21,
    size = 3,
    fill = "red") +
  #stats
  stat_compare_means(comparisons = my_comparisons,
    method = "wilcox.test",  
    label = "p.signif") +
  # títulos y etiquetas de ejes
  labs(title = "Riqueza específica de las subparcelas a través de los censos",
      x = "Año de censo",
      y = "Riqueza en especies de árboles")+
  theme_bw()
p 

Esto produce un gráfico similar al de arriba, pero con más control sobre la estética y la personalización. Con ggplot2, es posible superponer diferentes tipos de elementos gráficos, por ejemplo puntos, líneas, histogramas, diagrama de caja o comparación estadística, y ajustar numerosos aspectos de la figura, como los colores, los temas, las escalas de los ejes y las etiquetas.

Entre las principales ventajas de utilizar ggplot2 se encuentran:

  • Flexibilidad: permite crear gráficos complejos con código sencillo.

  • Personalización: permite controlar la apariencia de cada componente del gráfico.

  • Coherencia: utiliza una sintaxis coherente para generar varios tipos de gráficos, lo que facilita su aprendizaje y uso.

Gráficos interactivos con el paquete plotly

Para crear visualizaciones más interactivas, ggplot2 puede combinarse con el paquete plotly. Esto le permite generar gráficos en los que el usuario puede ampliar la vista, desplazarse por la figura o consultar información al pasar el cursor sobre los datos. Una opción sencilla consiste en convertir un gráfico creado con ggplot2 en un gráfico interactivo mediante la función ggplotly().

Podemos trazar el objeto ggplot con la función ggplotly

ggplotly(p)

Alternativa: crear un nuevo gráfico utilizando la función plot_ly

plot_ly(diversity_subplot, y=~richness, x=~CensusYear, type = "box", boxpoints = "all", jitter = 0.3)

En este ejemplo, la función ggplotly() se utiliza para convertir un gráfico ggplot2 en un objeto interactivo plotly. Las visualizaciones interactivas permiten interactuar con el gráfico en su navegador o en el panel de visualización de RStudio, y así explorar fácilmente grandes conjuntos de datos e identificar tendencias, patrones o valores particulares dentro del conjunto de datos.

Entre las ventajas de las visualizaciones interactivas se encuentran:

  • Exploración mejorada: los usuarios pueden hacer ampliar, desplazarse y explorar los datos con más detalle.

  • Mayor compromiso de los usuarios al hacer que los informes sean más atractivos y visualmente interesantes.

  • Aumenta la interactividad porque los usuarios pueden manipular la visualización de los datos en tiempo real, lo que es particularmente útil para grandes conjuntos de datos.

En conjunto, los gráficos estáticos e interactivos son herramientas esenciales para comunicar resultados de análisis de datos. Utilizando las funciones de R base, ggplot2 y plotly, R Markdown permite integrar una amplia gama de visualizaciones, lo que contribuye a la claridad, la reproducibilidad y la eficacia de su comunicación científica.

5. Análisis estadísticos e informes

Los análisis estadísticos cuantitativos y la modelización están presentes muchos proyectos en ecología y biología de las comunidades. Una de las principales ventajas de R Markdown es que permite integrar directamente el código de análisis estadísticos, las fórmulas de los modelos, las tables y los resultados dentro de los gráficos. Integrando todos los resultados contribuye a mejorar la transparencia del proceso analítico y de los resultados presentados.

En esta sección, no abordaremos en detalle todos los métodos estadísticos posibles ni su adecuación según los tipos de datos. Se recomienda consultar recursos específicos, como árboles de decisión analítico, para identificar enfoques estadísticos alternativos adaptados a sus preguntas de investigación.

Modelización demográfica y resumen estadístico de los datos

A modo de ejemplo en este taller se presenta un análisis demográfico basado en la tasa de mortalidad y de supervivencia de los tallos en el conjunto de datos Luquillo. Este enfoque permite explorar dinámicas de turnover (recambio) en las comunidades forestales a partir de los estados de los individuos (vivos o muertos) registrados durante los diferentes censos.

# Resumen demográfico por especie
demo_subplot <- luquillo.data %>%
  filter(Status %in% c("alive", "dead")) %>%
  group_by(QuadratName, PlotCensusNumber, Status) %>%
  summarise(
    n_stems = n(),
    .groups = "drop") %>%
  mutate(CensusYear = factor(PlotCensusNumber,
      levels = c(4, 5, 6),
      labels = c("2006", "2012", "2016")))

Cálculo de la tasa de renovación (turnover)

En este informe RMarkdown se calcula un indicador simple de recambio demográfico. Por razones de legibilidad y reproducibilidad del análisis, la fórmula utilizada se presenta explícitamente a continuación:

\[ \text{Tasa de renovación }_{i,t} = \frac{\text{tallos muertos}_{i,t}}{\text{tallos vivos}_{i,t} + \text{tallos muertos}_{i,t}} \]

Este indicador se calcula luego para cada subparcela y cada censo, donde i representa la subparcela y t el censo.

turnover <- demo_subplot %>%
  pivot_wider(names_from = Status,
    values_from = n_stems,
    values_fill = 0) %>%
  mutate(turnover_rate = dead / (alive + dead))

turnover <- turnover %>%
  mutate(mortality_rate = dead / (alive + dead))

Pregunta de investigación

Una de las preguntas ecológicas centrales de este análisis es determinar si una mayor densidad local de tallos vivos (proxy de la disponibilidad de recursos y de la competencia) se relaciona con una mayor mortalidad, o si la mortalidad es independiente de la densidad de las poblaciones. Este enfoque permite poner a prueba la hipótesis de dependencia a la densidad, a menudo asociada a procesos de competencia intraespecífica o interespecífica en los bosques tropicales.

Correlación y modelo mixto

En primer lugar, se explora la relación entre el número de tallos vivos y muertos mediante una correlación y una visualización gráfica. A continuación, se ajusta un modelo lineal mixto para evaluar el efecto potencial de la densidad sobre la mortalidad, teniendo en cuenta la variación entre censos mediante un efecto aleatorio asociado al año de censo (census year).

model_mixed <- lmer(mortality_rate ~ alive + (1 | CensusYear),
                    data = turnover)

#Extraer valores clave
sm <- summary(model_mixed)

beta_alive <- sm$coefficients["alive", "Estimate"]
p_alive <- sm$coefficients["alive", "Pr(>|t|)"]

sd_census <- attr(VarCorr(model_mixed)$CensusYear, "stddev")
sd_resid <- attr(VarCorr(model_mixed), "sc")^2

Utilizamos la función datatable() del paquete DT para presentar los resultados de la correlación y el modelo mixto en forma de tabla interactiva.

# Visualización interactiva con DT y broom.mixed
model_table <- broom.mixed::tidy(model_mixed, effects = "fixed") %>%
  mutate(across(where(is.numeric), ~ round(.x, 4)))


model_table_clean <- model_table %>%
  rename(Parámetro = term,
    Estimación = estimate,
    `Error Est.` = std.error,
    `valor t` = statistic,
    `valor p` = p.value)
  
DT::datatable(model_table_clean,
  caption = "Resultados del modelo lineal mixto",
  options = list(pageLength = 5))

Interpretación

Este modelo sugiere una relación débil entre la mortalidad y la densidad local de tallos vivos, aunque el efecto no es concluyente. El coeficiente estimado para la densidad es de -0.0073, con un valor p de 0.101. La variabilidad entre censos es moderada (desviación estándar = 0.206, indicando una cierta heterogeneidad temporal de las dinámicas de mortalidad.

Nota: Este enfoque permite extraer automáticamente las estimaciones estadisticas, los intervalos de confianza y los valores p a partir de los resultados del modelo, e integrarlos de manera dinámica en el informe. De este modo, se reducen los errores asociados a la transcripción manual de los resultados y se facilita la elaboración de documentos científicos reproducibles (“listos para publicar”).

6. Informe final

La integración de todos estos análisis y visualizaciones en un informe R Markdown permite crear documentos reproducibles, transparentes y fáciles de actualizar. Al combinar el código, junto con los resultados de los análisis estadísticos, y visualizaciones interactivas, el informe no solo presenta los resultados obtenidos, sino que también documenta el proceso seguido para generarlos.

Las ventajas de la integración de los análisis estadísticos en R Markdown son numerosas:

7. Actividades prácticas

Las actividades presentadas en este documento corresponden a la parte práctica del taller «Informe de investigación reproducible e interactiva con R-Markdown para ecólogos». Durante las dos primeras horas del taller, el personal docente presentó los fundamentos teóricos de la investigación reproducible y a las principales funcionalidades de R Markdown. Esta segunda mitad del taller está orientada a aplicar los conceptos abordados previamente y a guiar la creación de un informe completo, reproducible e interactivo con R Markdown.

Cada actividad propone un objetivo concreto y una serie de indicaciones para trabajar de forma autónoma. Las actividades pueden realizarse con un conjunto de datos propio, ecológico, experimental o de campo, o con el conjunto de datos de ejemplo utilizado en este documento.

Actividad 1 - Definir las herramientas y el marco del proyecto (10 min)

• Presente su conjunto de datos y los paquetes utilizados mediante bloques de código R Markdown correctamente anotados.

Ayuda: verifique la sección Paquetes R de la guía del taller.

• Controle la visibilidad del código y de las salidas con las opciones de los bloques de código (echo=, eval=, message=, etc.).

Ayuda: consulte la sección: Opciones de los chunks de la guía del taller.

Actividad 2 - Presentar el proyecto (20 min)

• Redacte una introducción general indicando los objetivos, las hipótesis y la estructura de su análisis.

• Adapte el nivel de detalle al público destinatario, por ejemplo, colaboradores, profesionales técnicos, publico no especializado.

Sugerencia: utilice una breve descripción de su propio proyecto de investigación o utilice el ejemplo proporcionado con el paquete fgeo.

Ayuda: consulte la sección sobre formato de Texto de la guía del taller para organizar el documento.

Inspírese en los ejemplos proporcionados en la sección Ejemplos de informes de investigación incluidos en publicaciones científicas de la guía del taller para estructurar su actividad.

Actividad 3 - Explorar y resumir los datos (30 min)

• Visualice y explore su conjunto de datos con las funciones de R base (str(), print(), head()) • Cree tablas interactivas con DT::datatable() para facilitar la exploración de los datos.

Mini-desafío 3.1: utilice un conjunto de datos propios (ya sea de datos ecológicos, experimentales o de campo) para explorar su estructura, identificar las entidades únicas (especies, individuos, grupos, etc.), y resumir los resultados en función de variables categóricas, como sitio, hábitat, tratamiento, año. Presente el resultado en una tabla interactiva con DT::datatable().

Ayuda: consulte la sección el código sobre Exploración de los datos con DT y dplyr de la guía del taller.

Actividad 4 - Visualizar los patrones (30 min)

• Realice visualizaciones con las funciones de R base, como (plot(), hist(), etc.)

• Cree visualizaciones más elaboradas con ggplot2.

Mini-desafío 4.1: reproduzca un gráfico en dos versiones: una estática y otra interactiva. Añada etiquetas o resumenes estadísticos con las funciones apply() o aggregate(). Ayuda: consulte la sección sobre Gráficos.

Actividad 5 - Realizar y presentar análisis estadísticos (30 min)

• Efectúe análisis estadísticos apropiados para su conjunto de datos y su pregunta de investigación.

Mini-desafío 5.1: presente los resultados en una tabla, destacando los indicadores clave (valores p, tamaños del efecto, etc.). Utilice código en línea (ej.: #r object) para insertar dinámicamente resultados directamente en el texto. Ayuda: consulte la sección el código sobre Informe de correlación.

Nota: los resultados pueden almacenarse de manera diferente según los objetos. Utilice los comandos de subconjunto “[]” o “$” para extraer los valores correctos. Ayuda: consulte la sección sobre Informe de correlación.

Escenarios de reflexión

Reflexione sobre la manera de estructurar un informe RMarkdown en los siguientes contextos:

  • Contexto 1 - Revisión de proyecto: Usted retoma un análisis después de varios meses para revisarlo y mejorarlo luego de sugerencias de sus colaboradores. ¿Cómo puede ayudarle el informe RMarkdown a comprender rápidamente lo que se hizo, a reproducir los análisis e a aplicar las sugerencias para mejorar los análisis?

  • Contexto 2 - Colaboración con una persona co-autora: Una persona colaboradora desea añadir nuevos datos, pero no conoce el método utilizado. ¿Cómo puede documentar claramente cada etapa para garantizar la reproducibilidad y facilitar la interpretación de los resultados ampliados?

  • Contexto 3 - Presentación a un público no técnico: Usted prepara una presentación para una entidad interesada en las aplicaciones de sus resultados. El público no necesita conocer los detalles técnicos ni el código empleado. ¿Cómo adaptaría el informe para destacar la naturaleza de los datos, los resultados clave y sus implicaciones de manera visual y accesible?

8. Referencias

Allaire, JJ, Yihui Xie, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, et al. 2023. Rmarkdown: Dynamic Documents for r.

Yihui Xie, Christophe Dervieux, Emily Riederer. 2025. R Markdown Cookbook

Yihui Xie, Allaire, JJ, Grolemund, G. 2023. R Markdown: The Definitive Guide.

Lepore M, Arellano G, Condit R, Davies S, Detto M, Gonzalez-Akre E, Hall P, Harms K, Herrmann V, Kenfack D, Lao S, McMahon S, Russo S, Anderson-Teixeira K, Zemunik G, Zuleta D (2019). fgeo: Analyze Forest Diversity and Dynamics. doi:10.32614/CRAN.package.fgeo R package version 1.1.4,