¿Por Qué Mi App No Funciona?
Inevitablemente, llegará un momento en que tu aplicación no se comporte como esperas: un gráfico no aparece, los datos no se filtran correctamente o la app simplemente se cierra con un error críptico. En un script normal, los errores suelen ser lineales y fáciles de rastrear. Pero en Shiny, la reactividad puede hacer que el proceso se sienta como una "caja negra".
Un cambio en un input puede desencadenar una compleja cadena de eventos, y si algo sale mal en medio de esa cadena, puede ser difícil identificar la causa raíz. La depuración (debugging) en Shiny no se trata solo de encontrar errores, sino de entender el flujo reactivo. Afortunadamente, R y Shiny nos proporcionan herramientas poderosas para iluminar esa caja negra.
Tus Herramientas de Detective
Para resolver los misterios de tu aplicación, necesitas las herramientas adecuadas. Aquí están las tres más importantes, de la más simple a la más avanzada.
print() y cat(): La Linterna
                        Son las herramientas más básicas y rápidas. Permiten imprimir el valor de un objeto o un mensaje directamente en la consola de R mientras la app se ejecuta. Son perfectas para verificaciones rápidas: "¿Está llegando el valor correcto de este input?" o "¿Cuántas filas tiene mi dataframe después de filtrar?".
Dentro de un contexto reactivo, cat() suele ser más fiable que print(). Úsalo con un salto de línea (\n) para mantener tu consola ordenada.
browser(): El Microscopio
                        Esta es la herramienta de depuración más poderosa de R. Cuando colocas browser() en tu código, actúa como un "punto de interrupción" (breakpoint). La ejecución de la aplicación se congela en esa línea exacta y te da control total sobre la consola de R en el entorno de la función. Puedes inspeccionar cualquier objeto, probar código línea por línea y entender el estado exacto de tu app en ese momento. Es indispensable para diagnosticar problemas complejos.
reactlog: El Mapa del Flujo Reactivo
                        Shiny tiene una herramienta de diagnóstico visual increíble llamada reactlog. Cuando la activas, registra cada evento reactivo que ocurre en tu aplicación. Después de interactuar con la app, puedes presionar una combinación de teclas (Ctrl + F3 o Cmd + F3) y se abrirá una visualización interactiva de tu grafo reactivo. Te muestra exactamente qué input causó qué reacción en cadena, qué partes se invalidaron y cuánto tiempo tomó cada cálculo. Es la mejor herramienta para optimizar el rendimiento y entender por qué una parte de tu app se actualiza (o no).
Taller Práctico: Encontrando al Culpable
Vamos a aplicar estas técnicas en nuestra aplicación modular para verlas en acción.
Paso 1: "Escuchar" la Reactividad con cat()
                        Abre tu archivo server.R. Dentro del conductor eventReactive, añade una línea con cat() para que nos notifique en la consola cada vez que se ejecute.
# En server.R
datos_analisis <- eventReactive(input$run_analysis, {
  
  # Añadimos esta línea para "escuchar"
  cat("--> El conductor eventReactive 'datos_analisis' se está ejecutando.\n")
  
  datos_saber %>%
    filter(cole_naturaleza == input$naturaleza_select)
})Ejecuta la app y mira la consola de R. No verás nada hasta que presiones el botón "Ejecutar Análisis". Esto te confirma visualmente cómo funciona el eventReactive.
Paso 2: Inspeccionar con browser()
                        Ahora, vamos a pausar la ejecución para inspeccionar. Añade browser() justo después de la línea de cat().
# En server.R, dentro del mismo eventReactive
datos_analisis <- eventReactive(input$run_analysis, {
  cat("--> El conductor eventReactive 'datos_analisis' se está ejecutando.\n")
  
  # Pausamos la ejecución aquí
  browser()
  
  datos_saber %>%
    filter(cole_naturaleza == input$naturaleza_select)
})Ejecuta la app y presiona el botón. La app se "congelará" y tu consola de R se volverá interactiva. Prueba a escribir input$naturaleza_select o head(datos_saber) para ver los valores en ese momento. Escribe c o Q en la consola para salir del modo de depuración y continuar la ejecución.
Paso 3: Visualizar el Grafo con reactlog
                        Abre tu archivo global.R y añade esta línea al principio. Esto activará el registro de eventos reactivos.
# Al inicio de global.R
options(shiny.reactlog = TRUE)
# ... resto de tu código de global.R (librerías, datos, etc.) ...
Ahora, sigue estos pasos:
- Ejecuta tu aplicación.
- Interactúa con ella: cambia los selectores, presiona el botón de análisis varias veces.
- Mientras la app está corriendo, presiona Ctrl + F3(en Windows/Linux) oCmd + F3(en Mac).