2017-03-03 34 views
1

我想在absolutePanel中使用一個條件面板創建一個圖表,只有當我在底圖上單擊鼠標時纔會出現。這不是問題,我已經實現了。Shiny Leaflet用鼠標點擊事件隱藏一個條件面板

但我希望情節清除和條件面板再次崩潰,一旦用戶跨過點彈出。此時,在執行另一次單擊操作時,情節會更改並重新標記數據,但這是彈出式菜單的清除,我希望鏈接到條件面板的摺疊;

這個非常簡單的例子說明了conditionalPanel的後點擊創建(完整版創建一個點並讀取光柵堆棧來繪製時間軸):

ui <- bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"), 
    leafletOutput("map", width="100%", height="100%"), 
    absolutePanel(class = "panel panel-default", fixed = TRUE,draggable = TRUE, 
       top = 20, left = 60, 

       conditionalPanel("input.map_click", 
        h4(textOutput("Click_text")), 
       top=20, left=60, height=400, width=200, 
       style="padding-left: 10px; padding-right: 8px; padding-top: 8px; padding-bottom: 8px") 
) 
) 


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

    output$map <- renderLeaflet({ 
    leaflet() %>% 
     setView(-4,52.5,9) %>% 
     addProviderTiles(providers$CartoDB.Positron) 
    }) 

    observeEvent(input$map_click, { 
    click <- input$map_click 
    text<-paste("Lattitude ", click$lat, "Longtitude ", click$lng) 
    text2 <- paste("YOUVE CLICKED THE MAP!!!",click$lat, click$lng) 

    proxy <- leafletProxy("map") 
    proxy %>% clearPopups() %>% 
     addPopups(click$lng, click$lat, text) 

    output$Click_text<-renderText({text2}) 
    }) 

} 

runApp(shinyApp(ui, server), launch.browser = TRUE) 

有一個建議in the documentation,有一個事件稱爲鼠標,但它可能只是鏈接到點擊實際標記,而不是點擊圖標,因爲我當然無法讓它工作。任何方式使該面板在消除彈出窗口後消失?

+0

根據它doesn」 [這](https://github.com/rstudio/leaflet/issues/183)鏈接popupclose事件似乎是在閃閃發光的實施。 – SBista

+0

感謝您的鏈接,我會警惕從2015年採取的東西仍然是在R的閃亮的情況下,因爲我知道2016年移動了很大的飛躍,但感謝它掛起 – Sam

回答

4

看來確實是該popup_close事件仍然沒有leaflet實施了R.

儘管如此,我們可以使用真棒htmlwidgets包構建它。

library(htmlwidgets) 

我們會用一些javascript到:

  • popupclose & popupopen事件。
  • 將事件發生的信息發送給Shiny

這都是可以的onRender()函數內部完成:

output$map <- renderLeaflet({ 
     leaflet() %>% 
      setView(-4,52.5,9) %>% 
      addProviderTiles(providers$CartoDB.Positron) %>% 

      onRender(" 
        function(el, x) { 
         this.on('popupopen', function(e) { 
          Shiny.onInputChange('myEvent', 'open'); 
         }); 

         this.on('popupclose', function(e) { 
          Shiny.onInputChange('myEvent', 'close'); 
         }); 
        }") 
    }) 

onRender()增加一次地圖呈現給執行一些JavaScript代碼。
在這種情況下,this.on('popupopen', function())創建事件偵聽器,而Shiny.onInputChange('myEvent', 'close')將值close指定爲input$myEvent

我們現在只需要改變條件面板:

conditionalPanel("input.myEvent == 'open'", ...) 
+0

這是偉大的感謝,完美的作品點擊事件。現在我試圖將leaflet.extras中的drawToolbar函數(特別是DELETESTOP偵聽器)合併到刪除繪製形狀時刪除圖形。 – Sam