Graficador de Funciones Matemáticas en R Shiny
Introducción
En este artículo veremos cómo crear una aplicación web interactiva en R Shiny que genere gráficos de funciones matemáticas en tiempo real.
Si estás dando tus primeros pasos en Shiny, te recomiendo revisar la excelente introducción de Manuel Oviedo aquí.
1. Paquetes Necesarios
Para este proyecto utilizaremos shiny para la arquitectura web reactiva y ggplot2 para el renderizado gráfico de alta calidad:
library(shiny)
library(ggplot2)2. Interfaz de Usuario (UI)
En la interfaz definimos un panel lateral (sidebarPanel) que contendrá tres controles: 1. Un textInput() donde el usuario escribe la función a evaluar (ejemplo: sin(x) o x^2 - 4). 2. Dos numericInput() para definir el dominio de evaluación de la variable \(x\) (límite inferior from y límite superior to). 3. Un panel principal (mainPanel) con plotOutput("distPlot") para visualizar el resultado.
ui <- fluidPage(
titlePanel("Graficador de Funciones"),
sidebarLayout(
sidebarPanel(
# Ingreso de la función en formato texto
textInput("funcion", "Ingrese la función:", value = "sin(x)"),
# Definición del dominio de x
numericInput("from", "Desde:", value = 0, min = -100, max = 100),
numericInput("to", "Hasta:", value = 10, min = -100, max = 100)
),
mainPanel(
plotOutput("distPlot")
)
)
)3. Lógica del Servidor (Server)
En el servidor evaluamos dinámicamente la expresión matemática introducida como texto. Para ello, utilizamos la función parse(text = ...) combinada con eval(), lo que permite convertir el string en una expresión interpretable por R en un contexto reactivo:
server <- function(input, output, session) {
# Cálculo reactivo de los puntos (x, y)
datos <- reactive({
x <- seq(input$from, input$to, by = 0.01)
y <- eval(parse(text = paste(input$funcion)))
data.frame(x = x, y = y)
})
# Renderizado del gráfico con ggplot2
output$distPlot <- renderPlot({
ggplot(datos(), aes(x, y)) +
geom_line(color = "#e74c3c", linewidth = 1) +
theme_minimal(base_size = 14) +
labs(
title = paste("Gráfico de f(x) =", input$funcion),
x = "Variable X",
y = "f(X)"
)
})
}4. Resultado Final en Acción
Al integrar ambos componentes con shinyApp(ui = ui, server = server), obtenemos una aplicación completamente funcional y reactiva:
