# Instalar paquetes si no están instalados
if (!require(shiny)) install.packages("shiny")
## Loading required package: shiny
## This version of 'bslib' is designed to work with 'shiny' >= 1.6.0.
## Please upgrade via install.packages('shiny').
if (!require(ggplot2)) install.packages("ggplot2")
## Loading required package: ggplot2
## Warning: replacing previous import 'lifecycle::last_warnings' by
## 'rlang::last_warnings' when loading 'tibble'
## Warning: replacing previous import 'ellipsis::check_dots_unnamed' by
## 'rlang::check_dots_unnamed' when loading 'tibble'
## Warning: replacing previous import 'ellipsis::check_dots_used' by
## 'rlang::check_dots_used' when loading 'tibble'
## Warning: replacing previous import 'ellipsis::check_dots_empty' by
## 'rlang::check_dots_empty' when loading 'tibble'
## Warning: replacing previous import 'lifecycle::last_warnings' by
## 'rlang::last_warnings' when loading 'pillar'
## Warning: replacing previous import 'ellipsis::check_dots_unnamed' by
## 'rlang::check_dots_unnamed' when loading 'pillar'
## Warning: replacing previous import 'ellipsis::check_dots_used' by
## 'rlang::check_dots_used' when loading 'pillar'
## Warning: replacing previous import 'ellipsis::check_dots_empty' by
## 'rlang::check_dots_empty' when loading 'pillar'
if (!require(scales)) install.packages("scales")
## Loading required package: scales
# Cargar librerÃas
library(shiny)
library(ggplot2)
library(scales)
# Datos
datos <- data.frame(
Tipo = c("Investigación", "Extensión"),
Proyectos = c(26, 20),
Valor = c(3598325770, 2403461911)
)
# UI
ui <- fluidPage(
titlePanel("Dashboard de Gestión de Proyectos"),
sidebarLayout(
sidebarPanel(
selectInput("tipo_grafico", "Seleccionar tipo de gráfico:",
choices = c("Barras", "Pastel")),
checkboxInput("mostrar_valores", "Mostrar valores", value = TRUE)
),
mainPanel(
plotOutput("grafico_proyectos"),
textOutput("info_liquidacion"),
verbatimTextOutput("resumen_estadistico")
)
)
)
# Server
server <- function(input, output) {
output$grafico_proyectos <- renderPlot({
if (input$tipo_grafico == "Barras") {
p <- ggplot(datos, aes(x = Tipo, y = Valor, fill = Tipo)) +
geom_bar(stat = "identity") +
scale_y_continuous(labels = label_number(suffix = " M", scale = 1e-6)) +
labs(title = "Distribución de Proyectos", y = "Valor (Millones de Pesos)") +
theme_minimal()
if (input$mostrar_valores) {
p <- p + geom_text(aes(label = Proyectos), vjust = -0.5)
}
} else {
p <- ggplot(datos, aes(x = "", y = Valor, fill = Tipo)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
labs(title = "Distribución de Proyectos") +
theme_minimal() +
theme(axis.text = element_blank())
if (input$mostrar_valores) {
p <- p + geom_text(aes(label = paste(Tipo, "\n", Proyectos, "proyectos")),
position = position_stack(vjust = 0.5))
}
}
p
})
output$info_liquidacion <- renderText({
"Aproximadamente 60 proyectos de investigación y extensión están en proceso de liquidación."
})
output$resumen_estadistico <- renderPrint({
cat("Resumen EstadÃstico:\n")
cat("Total de proyectos nuevos:", sum(datos$Proyectos), "\n")
cat("Valor total de proyectos:", format(sum(datos$Valor), big.mark = ","), "pesos\n")
cat("Promedio de valor por proyecto:", format(mean(datos$Valor), big.mark = ","), "pesos\n")
})
}
# Ejecutar la aplicación
shinyApp(ui = ui, server = server)
##
## Listening on http://127.0.0.1:7626
