【问题标题】:Dealing with no data in a dataset used to develop a shiny application (shiny, leaflet, R studio). error : subscript out of bounds处理用于开发闪亮应用程序(闪亮、传单、R studio)的数据集中没有数据。错误:下标越界
【发布时间】:2017-07-06 19:39:39
【问题描述】:

当我在闪亮应用程序中使用的数据集没有数据时,会出现错误:下标超出范围 - 并且应用程序保持空白,没有我的地图。我希望即使发生错误,地图也会出现但带有任何标记。我怎样才能做到这一点?

您好,我正在使用 R shiny 和小册子开发一个应用程序,该应用程序提供带有标记的地图,每次单击标记时,都会出现一个包含该特定标记信息的表格。此外,我还有一个通过 if/else 语句开发的侧栏,因此我可以搜索我想要的信息。解释一下,我可以搜索有关特定年份、那一年期间、特定条件和该条件状态的信息。 一切运行良好,但唯一的问题是处理我的数据集中缺失的信息(我没有一年特定时期的数据)。当我没有数据时,闪亮的错误会发生“下标越界”。我希望除此之外,地图出现但没有标记。所以,只有简单的地图。我已经开发了 if 和 else 语句,但它们并不成功。即使发生闪亮错误,我如何保留地图?
我需要在服务器中更改什么吗?还是用户界面?

服务器代码:

pal <- colorFactor(c("lawngreen", "red", "darkgray", "yellow", "orange"), 
                   domain = c("Confirmed negative", "Confirmed positive", "Don't know", "Likely negative", "Likely positive"))

shinyServer(function(input, output) {
    data_for_map <- reactive({
    if (input$disease_choice != "All") {
      if (input$disease_quarter != "All") {
        if (input$disease_status != "All") {
          data_to_plot <- pig_data_long %>%
            filter(disease == input$disease_choice, status == input$disease_status,
                   quarter == input$disease_quarter, year == input$disease_year)
        } else {
          data_to_plot <- pig_data_long %>%
            filter(disease == input$disease_choice, quarter == input$disease_quarter, year == input$disease_year)
        }
      } else { 
        if (input$disease_status != "All") {
          data_to_plot <- pig_data_long %>%
            filter(disease == input$disease_choice, status == input$disease_status, year == input$disease_year)
        } else {
          data_to_plot <- pig_data_long %>%
            filter(disease == input$disease_choice, year == input$disease_year)
        }
      }
      } else {
        if (input$disease_quarter != "All") {
          if (input$disease_status != "All") {
            data_to_plot <- pig_data_long %>%
                filter(status == input$disease_status, quarter == input$disease_quarter, year == input$disease_year)
            } else {
              data_to_plot <- pig_data_long %>%
                filter(quarter == input$disease_quarter, year == input$disease_year)
            }
          } else {
            if (input$disease_status != "All") {
              data_to_plot <- pig_data_long %>%
                filter(status == input$disease_status, year == input$disease_year)
            } else {
              data_to_plot <- pig_data_long %>%
                filter(year == input$disease_year)
            }
          }
      }

output$map <- renderLeaflet({
    leaflet("map") %>%
      setView(lng = -3.64, lat = 57.36, zoom = 7) %>%
      addTiles() %>%
      addCircleMarkers(data = data_for_map()[[2]],
                       radius = 4,
                       color = "black",
                       stroke = FALSE,
                       fillOpacity = 1,
                       popup = ~(slapmark)) %>%
      addCircleMarkers(data = data_for_map()[[1]], 
                       color = ~pal(status),
                       stroke = FALSE,
                       fillOpacity = 1,
                       popup = ~(paste(quarter, disease, status, sep = ": ")),
                       layerId = ~(paste(slapmark, disease, status, sep = "-"))) %>%
      addLegend("bottomright",
                colors = c("lawngreen", "yellow", "orange", "red", "darkgray"), 
                labels = c("Confirmed negative", "Likely negative", "Likely positive", "Confirmed positive", "Don't know"),
                title = "Legend",
                labFormat = labelFormat(),
                opacity = 1) 

  })

 output$clicked = DT::renderDataTable({
    point = input$map_marker_click
    if (!is.null(point)) {
      point_slapmark = strsplit(point$id, "-") [[1]][1]
      data_for_map()[[1]] %>%
        filter(slapmark == point_slapmark) %>%
        select(-latitude, -longitude) %>%
        DT::datatable(data_for_map, options = list(dom = 'ltipr'),
                      class = "display", callback = JS("return table;"),
                      style = "default")
    }
  }) 
 })

【问题讨论】:

    标签: shiny mapping leaflet


    【解决方案1】:

    你可以尝试创建一个简单的地图对象,然后像下面这样设置视图..

    output$map <- renderLeaflet({ 
      leaflet() %>%
      setView(lng = -3.64, lat = 57.36, zoom = 7)
    })
    

    然后在验证数据后使用 obeletProxy() 函数在 observe() 中添加标记等,例如 ..

    leafletProxy("map")  %>%
       addTiles() %>%
       addCircleMarkers(data = data_for_map()[[2]],
                       radius = 4,
                       color = "black",
                       stroke = FALSE,
                       fillOpacity = 1,
                       popup = ~(slapmark)) %>%
      addCircleMarkers(data = data_for_map()[[1]], 
                       color = ~pal(status),
                       stroke = FALSE,
                       fillOpacity = 1,
                       popup = ~(paste(quarter, disease, status, sep = ": ")),
                       layerId = ~(paste(slapmark, disease, status, sep = "-"))) %>%
      addLegend("bottomright",
                colors = c("lawngreen", "yellow", "orange", "red", "darkgray"), 
                labels = c("Confirmed negative", "Likely negative", "Likely positive", "Confirmed positive", "Don't know"),
                title = "Legend",
                labFormat = labelFormat(),
                opacity = 1) 
    

    【讨论】:

    • 您好,感谢您的帮助!它不工作......我不知道我是否真的需要使用leafletproxy..我想对闪亮说......“当错误发生并出现“下标越界”时运行基本地图”跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2021-12-02
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多