Три исправления, которые я обнаружил:
-
c(unique(geocodes$customer))
преобразует этот ввод в c(1,2,3)
. И когда вы позже попробуете подмножество имен клиентов «Джон», «Ахмет» и «Зара» по c (1,2,3) - это несовместимо и не удастся.
selectInput("account", label = "Account",
choices = c(unique(geocodes$customer)),
multiple = TRUE),
Изменить на:
selectInput("account", label = "Account",
choices = unique(geocodes$customer),
multiple = TRUE),
Я, к сожалению, не знаю, почему
clearMarkers()
в
leafletProxy()
не очищает маркеры, как вы ожидаете, но меняет исходную карту с рендеринга с
geocodes
на
reactiveDf()
(который по-прежнему возвращает
geocodes
кадр данных, если
input$account
равен нулю), похоже, решает эту проблему.
output$mymap <- renderLeaflet({
leaflet(geocodes) %>%
addProviderTiles("OpenStreetMap",
group = "OpenStreetMap"
) %>%
addAwesomeMarkers(
lng = ~longitude,
lat = ~latitude,
icon = customIcon,
clusterOptions = markerClusterOptions(),
label = ~customer,
popup = ~popup
)
})
Измените на:
output$mymap <- renderLeaflet({
leaflet(reactiveDf()) %>%
addProviderTiles("OpenStreetMap",
group = "OpenStreetMap"
) %>%
addAwesomeMarkers(
lng = ~longitude,
lat = ~latitude,
icon = customIcon,
clusterOptions = markerClusterOptions(),
label = ~customer,
popup = ~popup
)
})
Если вы хотите немного изменить архитектуру бит:
Используйте
observeEvent
, чтобы переопределить
geocodes
в соответствии с
input$account
и запустить вместе с ним leafletProxy (). Я полагаю, что мы оба упускаем какой-то шаг в отношении создания реактивного фрейма данных для
leafletProxy
, возможно, мы не можем полностью изменить источник данных, идущий с начального
renderLeaflet
на
leafletProxy
?
observeEvent(input$go, {
if(is.null(input$account)){
geocodes = geocodes
} else{
geocodes = geocodes[geocodes$customer %in% input$account,]
}
leafletProxy("mymap") %>%
clearShapes() %>%
clearPopups() %>%
clearMarkers() %>%
addMarkers(
data = geocodes,
lng = ~longitude,
lat = ~latitude,
label = ~customer,
)
}
)
Редактировать: Другой вариант - определить группу для каждого слоя маркеров и вызвать showGroup () и hideGroup () для управления визуально отображаемыми маркерами.
Надеюсь, это поможет