如何在传单地图中的闪亮应用程序中停止反应?

时间:2016-01-27 05:00:55

标签: r shiny leaflet reactive-programming

在我的闪亮应用中,我有selectInput SITE列出所有气象站和传单地图。按照上一个问题(How to get the zoom level from the leaflet map in R/shiny?),我可以setView而不更改缩放级别。

现在我想添加一项新功能,以允许用户点击地图中的标记并更新selectInput中的选定值。在我当前的代码中(请参阅下面的示例),所选的SITE值已更新,但也请调用setView来更改视点。

我期望的功能是1)选择新的网站更新视图,2)点击地图不会更新视图。

我怎样才能打破两个功能之间的联系?我想我可以使用isolate来实现它。说实话,我仍然对isolate感到困惑。

感谢您的任何建议。

这些是我的示例代码:

library(shiny)
library(leaflet)

df <- data.frame(
    site = c('S1', 'S2'),
    lng = c(140, 120),
    lat = c(-20, -30), 
    stringsAsFactors = FALSE)

# Define UI for application that draws a histogram
ui <- shinyUI(fluidPage(
    selectInput('site', 'Site', df$site),
    leafletOutput('map')

))

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

    output$map <- renderLeaflet({
        leaflet() %>%
            addTiles() %>% 
            setView(lng = 133, lat = -25,  zoom = 4) %>% 
            addMarkers(lng = df$lng, lat = df$lat, popup = df$site)
    })


    observe({
        sel_site <- df[df$site == input$site,]
        isolate({
            new_zoom <- 4
            if (!is.null(input$map_zoom)) new_zoom <- input$map_zoom
            leafletProxy('map') %>%
                setView(lng = sel_site$lng, lat = sel_site$lat, zoom = new_zoom)
        })
    })

    observe({
        event <- input$map_marker_click

        if (is.null(event))
            return()
        click_site <- df %>% 
            filter(lng == event$lng, lat == event$lat)
        isolate({
            updateSelectInput(session, 'site', selected = click_site$site)
        })
    })


})

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

这不是你要求的,因为它使用了一个按钮,但也许你可以很好地利用它。我还修复了你的过滤。

library(shiny)
library(leaflet)

df <- data.frame(
  site = c('S1', 'S2'),
  lng = c(140, 120),
  lat = c(-20, -30), 
  stringsAsFactors = FALSE)

ui <- shinyUI(fluidPage(
  selectInput('site', 'Site', df$site),
  actionButton("center","Center map on site"),
  leafletOutput('map')

))

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

  output$map <- renderLeaflet({
    leaflet() %>%
      addTiles() %>% 
      setView(lng = 133, lat = -25,  zoom = 4) %>% 
      addMarkers(lng = df$lng, lat = df$lat, popup = df$site)
  })
observeEvent(input$center,{
    sel_site <- df[df$site == input$site,]
    isolate({
      new_zoom <- 4
      if (!is.null(input$map_zoom)) new_zoom <- input$map_zoom
      leafletProxy('map') %>%
        setView(lng = sel_site$lng, lat = sel_site$lat, zoom = new_zoom)
    })
  })

  observe({
    event <- input$map_marker_click

    if (is.null(event))
      return()
    else{
    latdist<- unlist(lapply((event$lat - df$lat), FUN=abs))

      if (min(latdist)<4){ 
      match <- 
        df[with(df, {which(lat[latdist==min(latdist)] == lat ) 
      }), ]
      if(abs(match$lng-event$lng)<4)
      {
        click_site <- df[with(df,{ which(lng == match$lng & lat == match$lat) }),]  
      }
      updateSelectInput(session, 'site', selected = click_site$site)

     }# first if
    } # end else
  })
})

shinyApp(ui = ui, server = server)