Estructura general Shiny
Explicacion y comentarios
18 de noviembre de 2025
Estructura Shiny Comentarios y explicacion
Índice
1. Estructura General 2
1.1. Librerı́as Principales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Función de Clasificación de Variables . . . . . . . . . . . . . . . . . . . . . 2
1.3. Estructura de la Interfaz de Usuario . . . . . . . . . . . . . . . . . . . . . . 2
2. Implementación del Servidor 3
2.1. Gestión de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2. Interfaz de Usuario Dinámica . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Motor de Gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. Análisis Estadı́stico 6
3.1. Resumen Estadı́stico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2. Análisis de Correlación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3. Modelo de Regresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4. Sistema de Reportes 7
4.1. Generación de PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5. Caracterı́sticas Técnicas 8
5.1. Tabla de Funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.2. Flujo de Trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.3. Validaciones Implementadas . . . . . . . . . . . . . . . . . . . . . . . . . . 8
6. Conclusión 9
1
Estructura Shiny Comentarios y explicacion
1 Estructura General
1.1 Librerı́as Principales
La aplicación utiliza las siguientes librerı́as de R:
1 library ( shiny ) # Framework principal
2 library ( ggplot2 ) # V i s u a l i z a c i n de datos
3 library ( dplyr ) # M a n i p u l a c i n de datos
4 library ( DT ) # Tablas interactivas
5 library ( bslib ) # Temas Bootstrap
6 library ( plotly ) # G r f i c o s interactivos
1.2 Función de Clasificación de Variables
1 obtener _ tipo _ variable <- function ( var , datos ) {
2 if ( is . null ( datos ) || is . null ( var ) || var == " " ||
3 ! var %in % names ( datos ) ) {
4 return ( " No seleccionada " )
5 }
6 col _ data <- datos [[ var ]]
7 if ( is . numeric ( col _ data ) || is . integer ( col _ data ) ) {
8 return ( " N u m r i c a s " )
9 } else if ( is . factor ( col _ data ) || is . character ( col _ data ) ||
10 is . logical ( col _ data ) ) {
11 return ( " C a t e g r i c a s " )
12 } else {
13 return ( " Otras " )
14 }
15 }
1.3 Estructura de la Interfaz de Usuario
1 ui <- fluidPage (
2 theme = bs _ theme () ,
3 titlePanel ( " Explorador D i n m i c o de Variables " ) ,
4 sidebarLayout (
5 sidebarPanel (
6 h4 ( " Carga de Datos " ) ,
7 fileInput ( " file1 " , " Cargar Archivo CSV " , accept = " . csv " ) ,
8 h4 ( " S e l e c c i n de Variables " ) ,
9 numericInput ( " num _ vars _ input " ,
10 " Cantidad de Variables a Analizar " ,
11 value = 2 , min = 1 , max = 3) ,
12 uiOutput ( " var _ selector _ ui " ) ,
13 hr () ,
14 h4 ( " Tipo de G r f i c o " ) ,
15 selectInput ( " grafico _ seleccionado " ,
16 " Seleccione el tipo de g r f i c o : " ,
17 choices = c ( " Histograma " , " G r f i c o de Barras " ,
2
Estructura Shiny Comentarios y explicacion
18 " G r f i c o de D i s p e r s i n " ,
19 " Diagrama de Cajas y Bigotes " ,
20 " G r f i c o Multivariado " ) ) ,
21 uiOutput ( " opciones _ histograma _ ui " ) ,
22 uiOutput ( " bins _ slider _ ui " )
23 ),
24 mainPanel (
25 h3 ( " G r f i c o D i n m i c o " ) ,
26 plotlyOutput ( " grafico " , height = " 400 px " ) ,
27 hr () ,
28 h4 ( " Resumen E s t a d s t i c o de Var 1 " ) ,
29 v er ba ti mT ex tO ut pu t ( " resumen _ estadistico " ) ,
30 h4 ( " A n l i s i s E s t a d s t i c o " ) ,
31 textOutput ( " coef _ correlacion " ) ,
32 v er ba ti mT ex tO ut pu t ( " modelo _ regresion " ) ,
33 hr () ,
34 h4 ( " Vista Previa de Datos " ) ,
35 dataTableOutput ( " data _ table " )
36 )
37 )
38 )
2 Implementación del Servidor
2.1 Gestión de Datos
1 server <- function ( input , output , session ) {
2
3 datos <- reactive ({
4 req ( input $ file1 )
5 df <- read . csv ( input $ file1 $ datapath ,
6 header = TRUE ,
7 stringsAsFactors = TRUE )
8 for ( col in names ( df ) ) {
9 if ( is . character ( df [[ col ]]) || is . logical ( df [[ col ]]) ) {
10 df [[ col ]] <- as . factor ( df [[ col ]])
11 }
12 }
13 df
14 })
15
16 datos _ filtrados <- reactive ({
17 df <- datos ()
18 vars _ validas <- vars _ seleccionadas _ react ()
19 df _ filtrado <- df
20 for ( var in vars _ validas ) {
21 tipo <- obtener _ tipo _ variable ( var , df )
22 if ( tipo == " N u m r i c a s " ) {
23 rango <- input [[ paste0 ( " filtro _ num _ rango _ " , var ) ]]
24 if ( ! is . null ( rango ) ) {
25 df _ filtrado <- df _ filtrado %> %
26 filter ( ! ! sym ( var ) >= rango [1] &
27 ! ! sym ( var ) <= rango [2])
3
Estructura Shiny Comentarios y explicacion
28 }
29 } else if ( tipo == " C a t e g r i c a s " ) {
30 categorias <- input [[ paste0 ( " filtro _ cat _ " , var ) ]]
31 if ( ! is . null ( categorias ) ) {
32 df _ filtrado <- df _ filtrado %> %
33 filter ( ! ! sym ( var ) %in % categorias )
34 }
35 }
36 }
37 df _ filtrado
38 })
2.2 Interfaz de Usuario Dinámica
1 output $ var _ selector _ ui <- renderUI ({
2 req ( datos () )
3 tipos _ validos <- c ( " N u m r i c a s " , " C a t e g r i c a s " , " Otras " )
4 lapply (1: input $ num _ vars _ input , function ( i ) {
5 fluidRow (
6 column (12 ,
7 h4 ( paste ( " Variable " , i ) ) ,
8 c he ck bo xG ro up In pu t (
9 paste0 ( " var _ type _ filter _ " , i ) ,
10 " Filtrar por tipo : " ,
11 choices = tipos _ validos ,
12 selected = tipos _ validos
13 ),
14 uiOutput ( paste0 ( " var _ select _ ui _ " , i ) ) ,
15 textOutput ( paste0 ( " var _ type _ " , i ) )
16 )
17 )
18 })
19 })
20
21 observe ({
22 req ( datos () )
23 lapply (1: input $ num _ vars _ input , function ( i ) {
24 output [[ paste0 ( " var _ select _ ui _ " , i ) ]] <- renderUI ({
25 tipos _ seleccionados <- input [[ paste0 ( " var _ type _ filter _ " , i ) ]]
26 if ( is . null ( tipos _ seleccionados ) ) tipos _ seleccionados <- c ()
27 nombres _ filtrados <- names ( datos () ) [
28 sapply ( names ( datos () ) , function ( var )
29 obtener _ tipo _ variable ( var , datos () ) %in % tipos _ seleccionados
30 )
31 ]
32 selectInput (
33 paste0 ( " var " , i ) ,
34 paste ( " Selecciona Variable " , i ) ,
35 choices = c ( " " , nombres _ filtrados ) ,
36 size = 6 ,
37 selectize = FALSE
38 )
39 })
40 })
41 })
4
Estructura Shiny Comentarios y explicacion
2.3 Motor de Gráficos
1 generar _ grafico _ react <- reactive ({
2 req ( input $ grafico _ seleccionado )
3 df <- datos _ filtrados ()
4 vars <- vars _ seleccionadas _ react ()
5
6 if ( length ( vars ) == 0 || vars [1] == " " ) {
7 return ( ggplot () + labs ( title = " Seleccione variables v l i d a s " ) )
8 }
9
10 vars _ ordenadas <- reorganizar _ variables ( vars , df )
11 var1 <- vars _ ordenadas [1]
12 var2 <- if ( length ( vars _ ordenadas ) >= 2) vars _ ordenadas [2]
13 var3 <- if ( length ( vars _ ordenadas ) >= 3) vars _ ordenadas [3]
14
15 # L g i c a para g r f i c o s multivariados
16 if ( length ( vars _ ordenadas ) == 3 & & all ( vars _ ordenadas ! = " " ) ) {
17 tipo1 <- obtener _ tipo _ variable ( var1 , df )
18 tipo2 <- obtener _ tipo _ variable ( var2 , df )
19 tipo3 <- obtener _ tipo _ variable ( var3 , df )
20
21 if ( tipo1 == " N u m r i c a s " & & tipo2 == " C a t e g r i c a s " & &
22 tipo3 == " C a t e g r i c a s " ) {
23 df _ summary <- df %> %
24 group _ by ( ! ! sym ( var2 ) , ! ! sym ( var3 ) ) %> %
25 summarise ( Media = mean ( ! ! sym ( var1 ) , na . rm = TRUE ) ,
26 . groups = ’ drop ’)
27 p <- ggplot ( df _ summary ,
28 aes ( x = ! ! sym ( var2 ) , y = Media , fill = ! ! sym ( var3 ) ) ) +
29 geom _ col ( position = " stack " , alpha = 0.7)
30 return ( p + labs ( title = paste ( " Media de " , var1 , " por " , var2 , " y " ,
var3 ) ,
31 x = var2 , y = paste ( " Media de " , var1 ) , fill = var3 )
+
32 theme _ minimal () +
33 theme ( axis . text . x = element _ text ( angle = 45 , hjust = 1) ) )
34 }
35 }
36
37 # L g i c a para g r f i c o s univariados y bivariados
38 p <- ggplot ()
39 if ( input $ grafico _ seleccionado == " Histograma " ) {
40 num _ bins <- if ( ! is . null ( input $ num _ bins ) ) input $ num _ bins else 30
41 p <- ggplot ( df , aes ( x = ! ! sym ( var1 ) ) ) +
42 geom _ histogram ( aes ( y = .. density ..) , bins = num _ bins ,
43 fill = color _ fill _ base , color = color _ outline ,
44 alpha = 0.7)
45 }
46 # ... m s tipos de g r f i c o s
47 p + theme _ minimal ()
48 })
5
Estructura Shiny Comentarios y explicacion
3 Análisis Estadı́stico
3.1 Resumen Estadı́stico
1 output $ resumen _ estadistico <- renderPrint ({
2 df <- datos _ filtrados ()
3 vars <- vars _ seleccionadas _ react ()
4 if ( length ( vars ) >= 1 & & vars [1] ! = " " ) {
5 tipo _ var1 <- obtener _ tipo _ variable ( vars [1] , df )
6 if ( tipo _ var1 == " N u m r i c a s " ) {
7 cat ( " Resumen e s t a d s t i c o - Variable : " , vars [1] ,
8 " \ nTipo : N u m r i c o \ n \ n " )
9 summary ( df [[ vars [1]]])
10 } else if ( tipo _ var1 == " C a t e g r i c a s " ) {
11 cat ( " Tabla de frecuencias - Variable : " , vars [1] ,
12 " \ nTipo : C a t e g r i c o \ n \ n " )
13 table ( df [[ vars [1]]])
14 } else {
15 " Tipo de variable no compatible para resumen . "
16 }
17 } else {
18 " Seleccione al menos una variable . "
19 }
20 })
3.2 Análisis de Correlación
1 output $ coef _ correlacion <- renderText ({
2 df <- datos _ filtrados ()
3 vars <- vars _ seleccionadas _ react ()
4 if ( length ( vars ) >= 2 & & vars [1] ! = " " & & vars [2] ! = " " ) {
5 tipo _ var1 <- obtener _ tipo _ variable ( vars [1] , df )
6 tipo _ var2 <- obtener _ tipo _ variable ( vars [2] , df )
7 if ( tipo _ var1 == " N u m r i c a s " & & tipo _ var2 == " N u m r i c a s " ) {
8 correlacion <- cor ( df [[ vars [1]]] , df [[ vars [2]]] ,
9 use = " complete . obs " )
10 paste ( " Coeficiente de c o r r e l a c i n : " , round ( correlacion , 4) )
11 } else {
12 " La c o r r e l a c i n requiere dos variables n u m r i c a s . "
13 }
14 } else {
15 " Seleccione dos variables para a n l i s i s de c o r r e l a c i n . "
16 }
17 })
3.3 Modelo de Regresión
1 obtener _ resumen _ modelo <- reactive ({
2 df <- datos _ filtrados ()
3 vars <- vars _ seleccionadas _ react ()
6
Estructura Shiny Comentarios y explicacion
4 if ( length ( vars ) >= 2 & & vars [1] ! = " " & & vars [2] ! = " " ) {
5 tipo _ var1 <- obtener _ tipo _ variable ( vars [1] , df )
6 tipo _ var2 <- obtener _ tipo _ variable ( vars [2] , df )
7 if ( tipo _ var1 == " N u m r i c a s " & & tipo _ var2 == " N u m r i c a s " ) {
8 modelo <- lm ( paste ( vars [2] , " ~ " , vars [1]) , data = df )
9 return ( capture . output ( summary ( modelo ) ) )
10 }
11 }
12 return ( NULL )
13 })
14
15 output $ modelo _ regresion <- renderPrint ({
16 resumen <- obtener _ resumen _ modelo ()
17 if ( ! is . null ( resumen ) ) {
18 cat ( " Modelo de r e g r e s i n lineal :\ n " )
19 cat ( " F r m u l a : " , paste ( vars _ seleccionadas _ react () [2] , " ~ " ,
20 vars _ seleccionadas _ react () [1]) , " \ n \ n " )
21 cat ( paste ( resumen , collapse = " \ n " ) )
22 } else {
23 cat ( " El modelo de r e g r e s i n requiere dos variables n u m r i c a s . " )
24 }
25 })
4 Sistema de Reportes
4.1 Generación de PDF
1 output $ report _ pdf <- downloadHandler (
2 filename = function () {
3 generar _ nombre _ pdf ()
4 },
5 content = function ( file ) {
6 pdf ( file , width = 11 , height = 8.5)
7 tryCatch ({
8 print ( generar _ grafico _ react () )
9 grid . text ( paste ( " G r f i c o : " , input $ grafico _ seleccionado ) ,
10 x = 0.5 , y = 0.95 , just = " center " ,
11 gp = gpar ( fontsize = 14 , fontface = " bold " ) )
12 # ... m s contenido del reporte
13 } , error = function ( e ) {
14 plot . new ()
15 text (0.5 , 0.5 , " Error al generar el g r f i c o " ,
16 adj = 0.5 , cex = 1.2)
17 })
18 dev . off ()
19 }
20 )
21
22 generar _ nombre _ pdf <- reactive ({
23 vars <- vars _ seleccionadas _ react ()
24 vars _ validas <- vars [ vars ! = " " ]
25 if ( length ( vars _ validas ) == 0) {
26 base _ name <- " Analisis "
7
Estructura Shiny Comentarios y explicacion
27 } else if ( length ( vars _ validas ) == 1) {
28 base _ name <- paste ( " Analisis " , vars _ validas [1] , sep = " _ " )
29 } else {
30 relacion <- paste ( vars _ validas , collapse = " _ vs _ " )
31 base _ name <- paste ( " Relacion " , relacion , sep = " _ " )
32 }
33 paste0 ( base _ name , " _ " , Sys . Date () , " . pdf " )
34 })
5 Caracterı́sticas Técnicas
5.1 Tabla de Funcionalidades
Caracterı́stica Descripción
Carga de Datos Soporte para archivos CSV con detección automática
de formato
Selección de Variables Hasta 3 variables con filtrado por tipo
Tipos de Gráficos Histograma, Barras, Dispersión, Cajas, Multivariado
Personalización Colores, temas, parámetros especı́ficos por gráfico
Análisis Estadı́stico Resumen descriptivo, correlación, regresión lineal
Filtrado Dinámico Rangos numéricos y selección categórica
Reportes Exportación PDF con análisis completo
Interactividad Gráficos Plotly con zoom y tooltips
Cuadro 1: Resumen de funcionalidades de la aplicación
5.2 Flujo de Trabajo
1. Carga de datos: Selección de archivo CSV y preprocesamiento automático
2. Selección de variables: Elección de 1-3 variables con validación de tipos
3. Configuración de análisis: Selección de tipo de gráfico y personalización
4. Exploración interactiva: Aplicación de filtros y análisis en tiempo real
5. Generación de reportes: Exportación de resultados en formato PDF
5.3 Validaciones Implementadas
Verificación de existencia de archivo cargado
Validación de tipos de variables para cada análisis
8
Estructura Shiny Comentarios y explicacion
Comprobación de parámetros de entrada
Manejo de errores y casos edge
Mensajes informativos al usuario
6 Conclusión
La aplicación Explorador Dinámico de Variables representa una solución completa
para el análisis exploratorio de datos, combinando capacidades estadı́sticas avanzadas con
una interfaz accesible. Su arquitectura modular y sistema reactivo permiten un análisis
eficiente y personalizable de conjuntos de datos diversos.
Las principales ventajas de esta implementación incluyen:
Interfaz intuitiva para usuarios no técnicos
Análisis estadı́stico completo integrado
Visualizaciones profesionales y personalizables
Sistema de reportes automatizado
Código modular y mantenible
La aplicación está diseñada para ser extensible, permitiendo la incorporación de nuevas
funcionalidades y tipos de análisis según las necesidades especı́ficas del usuario.