2017-04-24 14 views
2

CircleMarkersのレイヤーがあり、特定のレイヤーIDを持つマーカーのみを削除しようとしています。これらの円マーカーのIDはデータフレーム内にあります。以下は 特定のリーフレットRを光沢のあるマーカーから除去する。

は簡単な例です:私は、IDの1及び2以下3

を削除するには、オプションでcheckboxInputを作ってみましたIDの1、2、3と3行のデータフレームがあるとし 入力はremoveMarker関数を使用するObserveEventをトリガーします。しかし、何も起こらない。私はidをremoveMarkerに入力する100万の方法を試しましたが、私は削除の他の方法のいくつかを試みました。何も起こらない、またはすべてが消えます。特定のマーカーを削除する方法が必要です。

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のためであるとことを示すために、時には私はグループ化されたデータを追加/削除する必要があります。本当の問題には約100万のIDがあるので、別々のグループに入れることを避けたいと考えていました。 – DS501

+0

あなたの例では、あなたがそれらを呼び出さなくてもグループに入れています。 'removeMarker(df [1:2,1])'はID1とID2をグループ化します。データフレーム内の変数を使ってそれらをグループ化すると、他の答えで示した '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のあるあなたは1で倍数を選択することができます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")} 
    }) 

}) 
関連する問題