selectInput 在我的传单地图闪亮应用程序中没有正确响应操作按钮

selectInput is not responding to action button properly in my leaflet map shiny app

我需要用 leaflet 包创建一个交互式地图,我可以在其中使用 selectInput 来控制在地图上显示哪些数据点。我还想使用图层控制按钮 select 一个或两个图层(数据点)出现在地图上。我的代码如下所示。

我希望地图仅在单击 go 按钮时响应 selectInput

当我 select selectInput 中的一项时,我的代码有效(单击 go 时地图会刷新)。 我发现当我 select 第二项时,最初我看到错误:subscript out of bounds。单击 go 时,两个标记都会出现。 当我删除两项 selected 中的一项时,地图会在单击操作按钮之前做出响应。

selectInput 似乎没有正确响应 action button。有谁知道为什么会这样?我做错了什么?我花了几个小时试图弄清楚但没有运气......提前致谢。

library(shiny)
library(leaflet)


hotels <- read.table(text = "Hotel Year  latitude        longitude
                              A   2000  41.886337      -87.628472
                              B   2005  41.88819       -87.635199
                              C   2010  41.891113      -87.63301", 
                     header = TRUE)


ui <- fluidPage(

    selectizeInput(inputId = 'year', label='Choose Year:',
                   choices = c(2000,2005,2010),
                   multiple=TRUE,
                   options = list(
                       maxItems = 2,
                       placeholder = '',
                       onInitialize = I("function() { this.setValue(''); }"))),
    actionButton("go", "go"),
    leafletOutput("mymap")

)

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

    df_list = reactive ({
        input$go

        isolate(
            if (length(input$year)>1) {
                list(hotels[hotels$Year == input$year[1],], 
                     hotels[hotels$Year == input$year[2],])
            } else {
                list(hotels[hotels$Year == input$year[1],])
            }

        )
    })

    output$mymap <- renderLeaflet({

        map = leaflet()  %>%
            addProviderTiles("OpenStreetMap.Mapnik") %>% 
            addCircleMarkers( data = df_list()[[1]] ,
                              group = 'Data Markers 1',
                              lng = ~longitude,
                              lat = ~latitude,
                              radius = 10,
                              stroke = F,
                              fillOpacity = 0.9,
                              color = 'red')
        if ( length(input$year)>1){
            map = map %>% 
                addCircleMarkers( data = df_list()[[2]] ,
                                  group = 'Data Markers 2',
                                  lng = ~longitude,
                                  lat = ~latitude,
                                  radius = 10,
                                  stroke = F,
                                  fillOpacity = 0.9,
                                  color = 'blue')
        }

        if ( length(input$year)>1) {
            map = map %>% 
                addLayersControl(
                    overlayGroups = c('Data Markers 1', 'Data Markers 2'),
                    options = layersControlOptions(collapsed = FALSE) )
        } else {
            map = map %>% 
                addLayersControl(
                    overlayGroups = c('Data Markers 1'),
                    options = layersControlOptions(collapsed = FALSE) )
        }

    })
}

shinyApp(ui, server)

要点是您在使用操作按钮时应该使用 observeEvent()。您混淆了反应路径,因此值未按您假设的顺序更改。

library(shiny)
library(leaflet)


hotels <- read.table(text = "Hotel Year  latitude        longitude
                     A   2000  41.886337      -87.628472
                     B   2005  41.88819       -87.635199
                     C   2010  41.891113      -87.63301", 
                     header = TRUE)


ui <- fluidPage(

  selectizeInput(inputId = 'year', label='Choose Year:',
                 choices = c(2000,2005,2010),
                 multiple=TRUE,
                 options = list(
                   maxItems = 2,
                   placeholder = '',
                   onInitialize = I("function() { this.setValue(''); }"))),
  actionButton("go", "go"),
  leafletOutput("mymap")

)

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

  # use the button for observeEvent
  # ignore values ensure an empty map is loading in the beginning
  observeEvent(input$go, ignoreInit = FALSE, ignoreNULL = FALSE, {

    # no need for a reactive list here
    if (length(input$year)>1) {
      df_list <- list(hotels[hotels$Year == input$year[1],], 
                     hotels[hotels$Year == input$year[2],])
    } else {
      df_list <- list(hotels[hotels$Year == input$year[1],])
    }

    output$mymap <- renderLeaflet({
      map <- leaflet()  %>%
        addProviderTiles("OpenStreetMap.Mapnik") %>% 
        addCircleMarkers( data = df_list[[1]] ,
                          group = 'Data Markers 1',
                          lng = ~longitude,
                          lat = ~latitude,
                          radius = 10,
                          stroke = F,
                          fillOpacity = 0.9,
                          color = 'red')
      # not using input does not invoke reactiveness
      if ( length(df_list) > 1){
        map <- map %>% 
          addCircleMarkers( data = df_list[[2]] ,
                            group = 'Data Markers 2',
                            lng = ~longitude,
                            lat = ~latitude,
                            radius = 10,
                            stroke = F,
                            fillOpacity = 0.9,
                            color = 'blue')
      }

      if ( length(input$year)>1) {
        map <- map %>% 
          addLayersControl(
            overlayGroups = c('Data Markers 1', 'Data Markers 2'),
            options = layersControlOptions(collapsed = FALSE) )
      } else {
        map <- map %>% 
          addLayersControl(
            overlayGroups = c('Data Markers 1'),
            options = layersControlOptions(collapsed = FALSE) )
      }

      map
    })
  })
}

shinyApp(ui, server)

注意:而是使用赋值箭头进行赋值 ;)