2017-04-24 3 views
2

CircleMarkers 레이어가 있는데 특정 레이어 ID가있는 마커 만 제거하려고합니다. 이 원 마커에 대한 ID는 데이터 프레임에 있습니다. 다음은 R의 특정 전단지 마커를 제거합니다.

은 간단한 예입니다 : 내가 ID의 1, 2 또는 아래 3

을 삭제하는 옵션이있는 checkboxInput을 만들려고 ID의 1, 2, 3과 3 개 행이 dataframe 있다고 가정 입력은 removeMarker 함수를 사용하는 ObserveEvent를 트리거합니다. 그러나 아무 일도 일어나지 않습니다. id를 removeMarker에 입력하는 데 수 백만 가지 방법을 시도했으며 다른 여러 가지 삭제 방법을 시도했습니다. 아무 일도 일어나지 않거나 모두 사라집니다. 특정 마커를 삭제하는 방법이 필요합니다.

ui <- shinyUI(fluidPage(
sidebarLayout(
    sidebarPanel(
     checkboxInput("delete1", "Delete ID=1 and 2",value=FALSE), 
    checkboxInput("delete3", "Delete ID=3",value=FALSE) 
    ), 
    mainPanel(
     leafletOutput("map") 
    ) 
) 
)) 

df <- data.frame(id=c(1,2,3),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(layerId=df$id,df$lng,df$lat, group='marker', radius=2, fill = TRUE,color='red') 


    ) 

observeEvent(input$delete1, { 
    proxy <- leafletProxy('map') 
    if (input$delete1){ proxy %>% removeMarker(df[1:2,1]) 
} 
}) 

observeEvent(input$delete3, { 
    proxy <- leafletProxy('map') 
    if (input$delete3){ proxy %>% removeMarker(3)} 
    }) 
}) 

shinyApp(ui, server) 

답변

0

다음과 같은 작업을 수행 할 수 있지만, 설정을 변경하면 상자를 선택 취소하면 마커가 다시 표시되지 않습니다.

server <- shinyServer(function(input, output, session) { 

    output$map <- renderLeaflet(
     leaflet() %>% 
     addTiles() %>% 

     # Add circle markers in different groups 
     addCircleMarkers(layerId=df$id[1:2], df$lng[1:2], df$lat[1:2], group='one', radius=2, fill = TRUE,color='red') %>% 
     addCircleMarkers(layerId=df$id[3], df$lng[3], df$lat[3], group='two', radius=2, fill = TRUE,color='red') 
    ) 

    # Remove group 'one' 
    observeEvent(input$delete1, { 
     proxy <- leafletProxy('map') 
     if (input$delete1){ proxy %>% clearGroup(group = "one")} 
    }) 

    # Remove group 'two' 
    observeEvent(input$delete3, { 
     proxy <- leafletProxy('map') 
     if (input$delete3){ proxy %>% clearGroup(group = "two")} 
    }) 
}) 

shinyApp(ui, server) 
+0

예 3 개의 id입니다 것을 보여 때로는 그룹화 된 데이터를 추가/제거해야합니다. 실제 문제에는 약 백만 개의 ID가 있으므로 개별 그룹에 넣지 않는 것이 좋습니다. – DS501

+0

예제에서는 호출하지 않아도 그룹으로 그룹화합니다. 'removeMarker (df [1 : 2,1])'는 ID 1과 ID 2를 함께 그룹화합니다. 데이터 프레임에서 변수를 통해 그룹화했다면 다른 답변에서 보여준'selectInput' 아이디어를 사용하여 반복적 인 코드를 피할 수 있습니다 (각 그룹에 새로운'observeEvent'를 사용해야 함). – Jake

0

나는 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) 
1

addCirleMarkers에서와 removeMarker있는 문자의 layerId, 당신은 시도 할 수있는 경우이 서버의 경우, 작동 어떤 이유 :

server <- shinyServer(function(input, output, session) { 

    output$map <- renderLeaflet(
    leaflet() %>% 
     addTiles() %>% addCircleMarkers(layerId=as.character(df$id),df$lng,df$lat, group='marker', radius=2, fill = TRUE,color='red') 


) 

    observeEvent(input$delete1, { 
    proxy <- leafletProxy('map') 
    if (input$delete1){ proxy %>% removeMarker(c("1","2")) 
    } 
    }) 

    observeEvent(input$delete3, { 
    proxy <- leafletProxy('map') 
    if (input$delete3){ proxy %>% removeMarker("3")} 
    }) 

})