leafletProxy no funciona en shinyDashboard
El leafletProxy parece no funcionar dentro de shinyDashboard. Ver el ejemplo de trabajo a continuación donde al elegir diferentes letras se debe cambiar el color del círculo. Cualquier idea es apreciada. Problema de Github creado aquí: https://github.com/rstudio/shinydashboard/issues/377
library(shiny)
library(shinydashboard)
library(leaflet)
library(sf)
n = 100
df1 = data.frame(id = 1:n,
x = rnorm(n, 10, 3),
y = rnorm(n, 49, 1.8))
pts = st_as_sf(df1, coords = c("x", "y"), crs = 4326)
map <- leaflet() %>%
addProviderTiles(provider = providers$CartoDB.DarkMatter) %>%
addCircles(data = pts, group = "pts") %>%
setView(lng = 10.5, lat = 49.5, zoom = 6)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
selectInput(inputId = 'click', 'Elegir uno:', c('A', 'B', 'C'))
),
dashboardBody(
fluidRow(
div(
id = 'map',
column(
width = 12,
leafletOutput('map', height = '800px')),
)
)
)
)
server <- function(input, output) {
output$map <- renderLeaflet({map})
observeEvent(input$click, {
col <- switch(input$click,
'A' = 'green',
'B' = 'yellow',
'C' = 'white')
m <- leafletProxy("map") %>%
clearShapes() %>%
addCircles(data = pts,
color = col)
m
})
}
shinyApp(ui, server)
davy.ai
El problema mencionado en la pregunta está relacionado con el uso de leafletProxy en shinyDashboard. Se espera que el código proporcionado en el ejemplo cambie el color de los círculos de leaflet según la entrada del selectInput en el dashboardSidebar. Sin embargo, parece que la función leafletProxy no puede actualizar el color de los círculos en este escenario. Se ha creado un problema de GitHub para informar sobre este problema (https://github.com/rstudio/shinydashboard/issues/377).
Mientras se espera una solución para el problema, una posible solución alternativa es crear un objeto reactivo separado que contenga el valor de entrada actual del selectInput y usarlo para actualizar el color de los círculos en la función addCircles. Aquí está el código del servidor modificado que implementa esta solución alternativa:
“`{r}
server <- function(input, output) {
output$map <- renderLeaflet({ map })
# Crear un objeto reactivo que contenga el valor de entrada actual
click_val <- reactive({ input$click })
observeEvent(click_val(), {
col <- switch(click_val(),
‘A’ = ‘green’,
‘B’ = ‘yellow’,
‘C’ = ‘white’)
})
}
“`
En resumen, aunque leafletProxy no parece ser funcional dentro de shinyDashboard, es posible utilizar un objeto reactivo como solución alternativa para actualizar el color de los círculos de leaflet según los valores de entrada del dashboardSidebar.