Construyendo el Simulador Interactivo

Uniendo la Interfaz de Usuario con la Lógica de Inferencia.

El Momento de la Verdad: Conectando las Piezas

Hemos recorrido un largo camino. Creamos un modelo y lo guardamos como un artefacto (`.rds`). Luego, encapsulamos la lógica para usar ese modelo en una función limpia dentro de un script de inferencia (`inference.R`). Ahora, es el momento de conectar todo.

En esta lección final del taller, construiremos la "tienda": la interfaz de usuario donde el cliente (nuestro usuario final) puede interactuar con el "motor" (nuestro modelo) que hemos construido. Añadiremos los controles necesarios en la UI y escribiremos la lógica en el `server` para orquestar la predicción en tiempo real.

Guía Práctica: Del Clic a la Predicción

Vamos a añadir una nueva pestaña a nuestra aplicación que funcionará como un simulador de puntajes de matemáticas.

Paso 1: Crear la Interfaz del Simulador en `ui.R`

Necesitamos un lugar para que el usuario ingrese los datos para la predicción y un espacio para mostrar el resultado. Añadiremos una nueva `tabPanel` a nuestra aplicación.

Acción: Abre tu archivo `ui.R` y añade el siguiente bloque de código dentro del `tabsetPanel`, después de la pestaña "Tabla de Datos".

# En ui.R, dentro del tabsetPanel(...)

tabPanel("Simulador de Puntaje",
    sidebarLayout(
        sidebarPanel(
            h3("Ingrese los puntajes:"),
            numericInput("sim_lectura", "Puntaje Lectura Crítica:", 70, min = 0, max = 100),
            numericInput("sim_sociales", "Puntaje Sociales:", 70, min = 0, max = 100),
            numericInput("sim_ciencias", "Puntaje Ciencias Naturales:", 70, min = 0, max = 100),
            actionButton("run_prediction", "Predecir Puntaje de Matemáticas", icon = icon("calculator"), class = "btn-success")
        ),
        mainPanel(
            h2("Resultado de la Predicción"),
            div(
                style = "background-color: #1e1e1e; padding: 30px; border-radius: 15px; text-align: center; margin-top: 20px;",
                h3("El puntaje predicho en matemáticas es:"),
                h1(style="color: #28a745; font-size: 5rem;", textOutput("prediction_result"))
            )
        )
    )
)

Paso 2: Implementar la Lógica de Predicción en `server.R`

Ahora, conectamos estos nuevos controles a nuestra función de inferencia. Usaremos un `eventReactive` para que la predicción solo se ejecute cuando el usuario haga clic en el botón.

Acción: Añade este bloque de código completo a tu archivo `server.R`.

# En server.R

# --- Lógica del Simulador ---
  
puntaje_predicho <- eventReactive(input$run_prediction, {
    
    # 1. Crear un dataframe con los datos de entrada del usuario
    nuevos_datos <- data.frame(
        punt_lectura_critica = input$sim_lectura,
        punt_sociales_ciudadanas = input$sim_sociales,
        punt_c_naturales = input$sim_ciencias
    )
    
    # 2. Llamar a nuestra función de inferencia encapsulada
    prediccion <- predict_math_score(new_data = nuevos_datos)
    
    return(prediccion)
})

# 3. Renderizar el resultado en la UI
output$prediction_result <- renderText({
    # Llamamos al conductor reactivo para obtener el valor predicho
    puntaje_predicho()
})

¡Ciclo MLOps Completado!

¡Felicidades! Has conectado todo el ciclo: un script de entrenamiento produce un artefacto, un script de inferencia lo encapsula, y la aplicación Shiny consume esa función para servir predicciones a un usuario final. Este es el corazón de un producto de datos funcional.

Paso 3: Versionar el Producto de Datos

Has completado una de las funcionalidades más importantes de la aplicación. Es un hito que debe ser guardado en el historial del proyecto.

# Añade los cambios en los archivos de la app
git add ui.R server.R

# Un commit que describe la nueva característica
git commit -m "feat(app): Implementa simulador interactivo de puntajes"

git push