我认为对ID进行分组仍然是可行的。那个分组变量可以添加到您的数据框中,您可以使用它来切换显示/隐藏点,就像我下面所示的那样。这与您最初尝试的并没有什么不同,因为您仍然必须明确地标识出要删除的ID。你仍然必须这样做,但现在你必须把它们放在定义好的组里。
require(shiny)
require(leaflet)
require(dplyr)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
checkboxInput("delete1", "Toggle ID 1 and 2", value = TRUE),
checkboxInput("delete3", "Toggle ID 3", value = TRUE)
),
mainPanel(
leafletOutput("map")
)
)
))
df <- data.frame(
id = c(1,2,3),
group = c("one", "one", "two"),
lng = rnorm(3, -106.1039361, 0.5) ,
lat = rnorm(3, 50.543981, 0.5)
)
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet(
leaflet() %>%
addTiles() %>%
addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
)
observeEvent(input$delete1, {
proxy <- leafletProxy('map')
proxy %>% clearGroup(group = "one")
if (input$delete1){
df <- filter(df, group == "one")
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
observeEvent(input$delete3, {
proxy <- leafletProxy('map')
proxy %>% clearGroup(group = "two")
if (input$delete3){
df <- filter(df, group == "two")
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
})
shinyApp(ui, server)
另一个可用的想法是使用
selectInput
而不是
checkboxInput
,您可以在其中选择多个选项。这将避免为每个组观察事件。如下所示。我设置默认情况下显示所有点,并且如果您选择一个组,则会将其从图中删除。
require(shiny)
require(leaflet)
require(dplyr)
df <- data.frame(
id = c(1,2,3),
group = c("one", "one", "two"),
lng = rnorm(3, -106.1039361, 0.5) ,
lat = rnorm(3, 50.543981, 0.5)
)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("toggle", "Toggle Groups", choices = unique(df$group), multiple = TRUE)
),
mainPanel(
leafletOutput("map")
)
)
))
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet(
leaflet() %>%
addTiles() %>%
addCircleMarkers(df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
)
observe({
proxy <- leafletProxy('map')
if(is.null(input$toggle)){
proxy %>% clearMarkers() %>%
addCircleMarkers(df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
} else {
proxy %>% clearMarkers()
df <- filter(df, !(group %in% input$toggle))
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
})
shinyApp(ui, server)
removeMarker(df[1:2,1])
将 ID 为 1 和 2 的数据分为一组。如果你通过数据框中的某个变量将它们分组,那么你可以避免很多重复的代码(需要为每个组使用一个新的observeEvent
),使用我在另一个答案中展示的selectInput
想法。 - Jake