简体   繁体   English

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

[英]How to stop reactive in a shiny app in the leaflet map?

In my shiny app, I have a selectInput SITE to list all weather stations and a leaflet map. 在我的闪亮应用程序中,我有一个selectInput SITE来列出所有气象站和一张传单地图。 Following my previous question ( How to get the zoom level from the leaflet map in R/shiny? ), I can setView without changing zoom level. 遵循我的上一个问题( 如何从R / shiny中的传单地图中获取缩放级别? ),我可以setView不更改缩放级别的情况下设置setView

Now I want to add a new feature to allow users to click markers in the map and update the selected values in the selectInput . 现在,我想添加一个新功能,以允许用户单击地图中的标记并更新selectInput的选定值。 In my current codes (see below for an example), the selected value of SITE is updated, but also call the setView to change the view point. 在我当前的代码中(请参见下面的示例),更新了SITE的选定值,但还调用了setView来更改视点。

My expected features are 1) Selection of new site updates view, 2) Click of map doesn't update view. 我的预期功能是1)选择新的站点更新视图,2)单击地图不会更新视图。

How could I break linkage between two features? 如何打破两个功能之间的联系? I guess I can use isolate to achieve it. 我想我可以使用isolate来实现它。 To be honest, I am still confusing about isolate . 老实说,我仍然对isolate感到困惑。

Thanks for any suggestions. 感谢您的任何建议。

These are my example codes: 这些是我的示例代码:

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)

This is not exactly what you asked for, because it uses a button, but maybe you can make a good use of it. 这并不是您所要求的,因为它使用了一个按钮,但是也许您可以充分利用它。 I also fixed your filtering. 我还修复了您的过滤条件。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM