【问题标题】:Leaflet map responsive to csv fileInput in Shiny在 Shiny 中响应 csv fileInput 的传单地图
【发布时间】:2018-06-04 20:48:06
【问题描述】:

我有一个简单的闪亮应用程序,可以从 csv 文件输入中绘制点。目前,当我将文件上传到闪亮的应用程序时,地图没有做任何事情。我认为这是因为传单地图没有对上传的文件做出反应。我怎么能解决这个问题?

请参阅下面的代码。样本数据可以在HERE找到。

library(shiny)
library(shinydashboard)
library(leaflet)
library(dplyr)
library(htmltools)

shinyApp(
  ui <- fluidPage(

    titlePanel("eBird Visualizer"),
    fileInput("MyEBirdData_in", "MyEBirdData", buttonLabel = "Upload a .csv", 
              placeholder = "No File Selected...", width = "255px", 
              accept = ".csv"),
    leafletOutput("myMap")
  ),

  server = function(input, output) {

    output$contents <- renderTable({

      inFile <- input$MyEBirdData_in
      if (is.null(inFile))
        return(NULL)
      myData = read.csv(inFile$datapath, header = input$header)

      df0 = data.frame(myData$Submission.ID, myData$Latitude, myData$Longitude)
      df = unique(df0)
      names(df)[2] = 'latitude'
      names(df)[3] = 'longitude'

    })

    output$myMap = renderLeaflet({

      leaflet(data = df) %>% addProviderTiles(providers$CartoDB.Positron)
    })
  }
)

【问题讨论】:

标签: r csv shiny leaflet r-leaflet


【解决方案1】:

renderTable 用于创建要在 UI 中显示的反应表。你想要的是有一个可以在其他反应式表达式中使用的变量来触发它们更新,在这种情况下你应该使用reactivereactiveValue,例如参见here;在页面下方 2/3 处,他们首先介绍了 reactive 作为一个很好的例子。

另外,您当前指的是input$header,它没有定义。因此,您在上传 csv 时会出错。

所以你可以这样做:

library(shiny)
library(shinydashboard)
library(leaflet)
library(dplyr)
library(htmltools)

shinyApp(
  ui <- fluidPage(

    titlePanel("eBird Visualizer"),
    fileInput("MyEBirdData_in", "MyEBirdData", buttonLabel = "Upload a .csv", 
              placeholder = "No File Selected...", width = "255px", 
              accept = c(".csv","text/csv")),
    leafletOutput("myMap")
  ),

  server = function(input, output) {

    my_table <- reactive({

      inFile <- input$MyEBirdData_in
      if (is.null(inFile))
        return(NULL)

      myData = read.csv(inFile$datapath)

      df0 = data.frame(myData$Submission.ID, myData$Latitude, myData$Longitude)
      df = unique(df0)
      names(df)[2] = 'latitude'
      names(df)[3] = 'longitude'
      print(df)
      return(df)
    })

    output$myMap = renderLeaflet({
      if(is.null(my_table()))
      {
        return(leaflet()  %>% addProviderTiles(providers$CartoDB.Positron))
      }
      else
      {
        leaflet(data = my_table()) %>% addProviderTiles(providers$CartoDB.Positron) %>% addMarkers()
      }
    })
  }
)

【讨论】:

  • 这看起来很棒而且更有意义,谢谢。但是,当我尝试将其写入我的代码并运行应用程序并上传 csv 时,它给了我一个错误:无效的参数类型。不确定在哪里/为什么会发生这种情况?
  • 嗨,您的代码可能还有其他问题,我没有检查。我明天帮你查
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 2018-08-26
  • 2017-02-08
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多