나는 ID를 그룹화하는 것이 여전히 방법이라고 생각합니다. 그런 다음 그룹화 변수를 데이터 프레임에 추가 할 수 있으며이를 사용하여 아래에 설명 된대로 점 표시/숨기기를 전환 할 수 있습니다. 제거하려는 ID를 구체적으로 식별해야하기 때문에 원래 시도했던 것과 다른 점이 없습니다. 여전히 그렇게해야하지만 이제는 정의 된 그룹에 넣어야합니다. 당신이 사용할 수
require(shiny)
require(leaflet)
require(dplyr)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
#Set value = TRUE so points are shown by default
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),
#Add grouping variable
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() %>%
#Add markers with group
addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
)
observeEvent(input$delete1, {
proxy <- leafletProxy('map')
#Always clear the group first on the observed event
proxy %>% clearGroup(group = "one")
#If checked
if (input$delete1){
#Filter for the specific group
df <- filter(df, group == "one")
#Add the specific group's markers
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
#Repeat for the other groups
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)
또 다른 아이디어는 대신 checkboxInput
의 당신이 하나 배수를 선택할 수 selectInput
입니다. 그러면 각 그룹에 대해 observeEvents
을 절약 할 수 있습니다. 그것이 아래에 나와 있습니다. 나는 모든 포인트가 표시되도록 기본값을 설정하고, 그룹을 선택하면 플롯에서 그룹을 제거합니다.
require(shiny)
require(leaflet)
require(dplyr)
df <- data.frame(
id = c(1,2,3),
#Add grouping variable
group = c("one", "one", "two"),
lng = rnorm(3, -106.1039361, 0.5) ,
lat = rnorm(3, 50.543981, 0.5)
)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
#Set value = TRUE so points are shown by default
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 {
#Always clear the shapes on the observed event
proxy %>% clearMarkers()
#Filter for the specific group
df <- filter(df, !(group %in% input$toggle))
#Add the specific group's markers
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
})
shinyApp(ui, server)
예 3 개의 id입니다 것을 보여 때로는 그룹화 된 데이터를 추가/제거해야합니다. 실제 문제에는 약 백만 개의 ID가 있으므로 개별 그룹에 넣지 않는 것이 좋습니다. – DS501
예제에서는 호출하지 않아도 그룹으로 그룹화합니다. 'removeMarker (df [1 : 2,1])'는 ID 1과 ID 2를 함께 그룹화합니다. 데이터 프레임에서 변수를 통해 그룹화했다면 다른 답변에서 보여준'selectInput' 아이디어를 사용하여 반복적 인 코드를 피할 수 있습니다 (각 그룹에 새로운'observeEvent'를 사용해야 함). – Jake