2017-02-16 18 views
0

スライダーバーの範囲内の値を持つ行にポイントをプロットするだけの光沢のあるアプリを作成しようとしています。スライダバーの範囲を広げるとポイントが追加されますが、スライダバーの範囲を小さくするとポイントは削除されません。以下は私の問題の再現可能な例です。スライダバーをフルレンジにすると、マップ上に3点が表示されます。範囲を十分に小さくすると1点が拡大されますが、ズームアウトすると3点がマップ上に表示されます。チラシのclearShapes関数やclearMarkers関数がこれらの点を削除すると思ったが、機能していない。助言がありますか?スライダーバー付きの光沢のあるアプリでリーフレットマーカーをクリアする

library(shiny) 
library(leaflet) 
library(tidyverse) 

ui <- fluidPage(

    titlePanel("Test"), 

    sidebarLayout(
     sidebarPanel(
     radioButtons("choice","Group:",choices = c(1,2), selected = 1), 
     uiOutput("value"), 
     verbatimTextOutput("Click_text") 
    ), 

     mainPanel(
     leafletOutput("Map") 
    ) 
    ) 
) 

server <- function(input, output) { 

    df <- data.frame(lat = c(42.34,43.65,45.26,48.63,47.65,47.52), 
        lng = c(-96.43,-97.45,-98.56,-92.35,-94.56,-95.62), 
        id = c(32,45,65,76,34,12), 
        grp = c(1,1,1,2,2,2), 
        val = c(1.75,2.12,3.2,3.32,4.76,4.85)) 

    subsetData1 <- reactive({ 

    df %>% filter(grp == input$choice) 

    }) 

    output$value <- renderUI({ 

    sliderInput("value",label = h3("value"), 
       min = min(subsetData1()$val,na.rm = TRUE), 
       max = max(subsetData1()$val,na.rm=TRUE), 
       value = c(quantile(subsetData1()$val,.25,na.rm = TRUE),quantile(subsetData1()$val,.75,na.rm=TRUE))) 

    })  

    subsetData <- reactive({ 

    df2 <- subsetData1() %>% data.frame() 

    df2 %>% filter(val >= min(as.numeric(input$value)) & val <= max(as.numeric(input$value))) 

    }) 

    output$Map <- renderLeaflet({ 

    leaflet(height = 1000) %>% 
     addTiles() %>% 
     fitBounds(min(df$lng),min(df$lat),max(df$lng),max(df$lat)) 

    }) 

    observe({ 
    leafletProxy("Map") %>% 
     clearMarkers() %>% 
     clearShapes() %>% 
     addCircleMarkers(data = subsetData(), 
         lng = ~lng, 
         lat = ~lat, 
         layerId = ~id, 
         radius = 8, 
         weight = 10) %>% 
     fitBounds(.,min(subsetData()$lng),min(subsetData()$lat), 
       max(subsetData()$lng),max(subsetData()$lat)) 

    }) 

    observe({ 

    click<-input$Map_marker_click 
    if(is.null(click)) 
     return() 
    text<-paste("Latitude ", click$lat, "Longtitude ", click$lng) 
    text2<-paste("You've selected point ", click$id) 

    output$Click_text<-renderText({ 
     text2 
    }) 

    }) 

} 

# Run the application 
shinyApp(ui = ui, server = server) 

答えて

1

あなたはobserveEvent関数にあなたをクリアマーカーあなたのobserve機能を変更することができます。

observeEvent(input$value,{ 
    leafletProxy("Map") %>% 
     clearMarkers() %>% 
     clearShapes() %>% 
     addCircleMarkers(data = subsetData(), 
         lng = ~lng, 
         lat = ~lat, 
         layerId = ~id, 
         radius = 8, 
         weight = 10) %>% 
     fitBounds(.,min(subsetData()$lng),min(subsetData()$lat), 
       max(subsetData()$lng),max(subsetData()$lat)) 

    }) 

また、(value)同じようuiOutputsliderInputのidの両方を持っています。すべての要素に一意のIDがあることを確認する必要があります。それらの名前を一意のものに変更します。

+0

同じスライダを構築していたので、IDが同じであるかどうかはわかりませんでした。それを明確にしてくれてありがとう。あなたのソリューションは機能します。助けてくれてありがとう! – SoloAus

+0

@SoloAus、この回答があなたの問題の解決に役立つ場合は、投票矢印の下にあるチェックマークを使用して[受け入れられるとマークする](https://stackoverflow.com/help/someone-answers)を検討してください。ありがとうございました! – krish

+0

は、すべてのマーカーをクリアしなくてもこれを行う方法はありますか? – nate

関連する問題