-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathejemplo1.R
More file actions
122 lines (105 loc) · 4.16 KB
/
Copy pathejemplo1.R
File metadata and controls
122 lines (105 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
### paquetes --------------------------------------------------------
library(shiny)
library(ggplot2)
library(dplyr)
### datos --------------------------------------------------------
# Cargar el dataset paises de la biblioteca datos
# Si datos no está disponible, instálalo con: install.packages("datos")
library(datos)
### Interfaz de usuario --------------------------------------------------------
ui <- fluidPage(
titlePanel("Explorador de Esperanza de Vida"),
fluidRow(
column(8,
p("Controles"),
selectInput("continente", "Seleccionar Continente:",
choices = levels(paises$continente),
selected = levels(paises$continente)[1]),
selectInput("pais", "Seleccionar País:",
choices = NULL),
# Añadir botón de descarga del gráfico
conditionalPanel(
condition = "input.pais !== null && input.pais !== ''",
hr(),
downloadButton("descargarGrafico", "Descargar Gráfico (PNG)")
)
),
column(4,
h4("Esperanza de Vida a lo Largo del Tiempo"),
# Añadir un panel condicional para mostrar instrucciones cuando no se selecciona un país
conditionalPanel(
condition = "input.pais === null || input.pais === ''",
div(
style = "text-align: center; margin-top: 100px; color: #888;",
h3("Por favor, seleccione un continente y un país para ver el gráfico de esperanza de vida")
)
),
# Mostrar el gráfico solo cuando se selecciona un país
conditionalPanel(
condition = "input.pais !== null && input.pais !== ''",
plotOutput("graficoEsperanzaVida")
)
)
) #cierra fluid row
) # cierra fluid page
### SERVER --------------------------------------------------------
server <- function(input, output, session) {
# Filtrar países basados en la selección de continente
datos_filtrados <- reactive({
paises %>% filter(continente == input$continente)
})
# Actualizar el desplegable de países basado en la selección de continente
observe({
paises_lista <- unique(datos_filtrados()$pais)
paises_ordenados <- c("", sort(as.character(paises_lista)))
# Actualizar el desplegable de país
updateSelectInput(session, "pais",
choices = paises_ordenados,
selected = "")
})
# Crear la función para generar el gráfico (para reutilizar en la descarga)
crear_grafico <- function() {
# Obtener datos del país seleccionado
datos_pais <- paises %>%
filter(pais == input$pais)
# Crear gráfico con el nuevo estilo
ggplot(datos_pais) +
geom_point(aes(y = esperanza_de_vida, x = anio, colour = pais), size = 2) +
geom_line(aes(y = esperanza_de_vida, x = anio, group = pais, colour = pais), linewidth = 1) +
scale_x_continuous(
limits = c(1950, 2010),
breaks = seq(1950, 2010, by = 10)
) +
scale_color_manual(values = c("#61007d")) +
labs(
y = "Esperanza de vida",
x = "Año",
title = paste("Esperanza de vida en", input$pais),
subtitle = "Evolución quinquenal, años 1952 a 2007",
caption = "Fuente: paquete datos, dataset paises"
) +
theme_bw() +
theme(legend.position = "none")
}
# Renderizar el gráfico para la UI
output$graficoEsperanzaVida <- renderPlot({
req(input$pais)
# Comprobación adicional para asegurar que tenemos una selección válida de país
validate(
need(input$pais != "", "Por favor, seleccione un país")
)
crear_grafico()
})
# Configurar la descarga del gráfico en PNG
output$descargarGrafico <- downloadHandler(
filename = function() {
# Generar nombre de archivo con el país seleccionado
paste("esperanza_vida_", gsub(" ", "_", input$pais), ".png", sep = "")
},
content = function(file) {
# Guardar el gráfico en formato PNG
ggsave(file, plot = crear_grafico(), device = "png", width = 10, height = 6, dpi = 300)
}
)
}
shinyApp(ui, server)