# La interfaz gráfica
<- fluidPage(
ui sidebarLayout(
sidebarPanel(
radioButtons(
inputId = "sex",
label = "Sexo",
choices = c("female", "male")
)
),
mainPanel(
plotlyOutput(outputId = "chart"),
dataTableOutput(outputId = "table")
)
)
)
# El servidor
<- function(input, output) {
server
$chart <- renderPlotly({
output<- filter(penguins, !is.na(sex), sex == input$sex)
tmp plot_ly(tmp, type = "scatter", mode = "markers",
x = ~body_mass_g, y = ~flipper_length_mm)
})
$table <- renderDataTable({
output%>%
penguins filter(!is.na(sex), sex == input$sex) %>%
select(species, sex, body_mass_g, flipper_length_mm)
})
}
# Generamos la aplicación
shinyApp(ui = ui, server = server)
Soluciones capítulo 9
Para probar correctamente las aplicaciones shiny, tendrás que copiar y pegar el código a un intérprete de R.
Actividad 1
Crea una aplicación, utilizando el dataset de los pingüinos, que tenga:
Como inputs, unos radio buttons para elegir el sexo.
Como outputs:
- Un gráfico de puntos de plotly mostrando en el eje x el peso, y en el eje y la longitud de la aleta, y con un color diferente por especie, solo para el sexo escogido.
- Una datatable paginada con el detalle de especie, sexo, peso y longitud de la aleta, para el sexo escogido.
Actividad 2
Crea una aplicación de shiny para visualizar las líneas y paradas del metro de Madrid sobre un mapa interactivo.
Tienes disponible los datos en dat/lineas_metro.geojson
y dat/paradas_metro_madrid.geojson
.
La aplicación tendrá:
- Como inputs, el listado de líneas disponibles.
- Como output, un mapa de
leaflet
mostrando la línea y sus paradas sobre Madrid.
<- read_sf("dat/lineas_metro.geojson")
lineas_metro <- lineas_metro$Linea
lineas_select names(lineas_select) <- lineas_metro$Texto
# La interfaz gráfica
<- fluidPage(
ui sidebarLayout(
sidebarPanel(
selectInput(
inputId = "linea",
label = "Línea",
choices = lineas_select
)
),
mainPanel(
leafletOutput(outputId = "map")
)
)
)
# El servidor
<- function(input, output) {
server
<- read_sf("dat/paradas_metro_madrid.geojson")
paradas_metro <- read_sf("dat/lineas_metro.geojson")
lineas_metro
<- c(
colores_lineas "L1" = "#38a3dc",
"L2" = "#f40104",
"L3" = "#fbe115",
"L4" = "#944247",
"L5" = "#96bf0e",
"L6" = "#9fa4a6",
"L7" = "#f7a64b",
"L8" = "#f500ff",
"L9" = "#a3228d",
"L10" = "#174594",
"L11" = "#185b00",
"L12" = "#a49a00",
"Ramal" = "#090080"
)
<- colorFactor(
paleta_lineas palette = unname(colores_lineas),
levels = names(colores_lineas)
)
$map <- renderLeaflet({
output# Filtros
<- lineas_metro %>%
tmp_lineas filter(Linea == input$linea)
<- paradas_metro %>%
tmp_paradas filter(line == input$linea)
leaflet(tmp_lineas) %>%
addProviderTiles("CartoDB.Positron") %>%
setView(lng = -3.69, lat = 40.43, zoom = 12) %>%
addPolylines(data = tmp_lineas, color = ~paleta_lineas(Linea), opacity = 0.8) %>%
addCircleMarkers(data = tmp_paradas, stroke = FALSE, radius = 5, fillOpacity = 0.5) %>%
addLegend(
position = "bottomright",
pal = paleta_lineas,
values = ~Linea,
title = "Línea"
)
})
}
# Generamos la aplicación
shinyApp(ui = ui, server = server)