响应 Shiny 中的 csv fileInput 的传单地图

Leaflet map responsive to csv fileInput in Shiny

我有一个简单的 shiny 应用程序,它可以绘制来自 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)
    })
  }
)

renderTable 用于创建要在 UI 中显示的反应式 table。你想要的是有一个可以在其他反应表达式中使用的变量来触发它们更新,在这种情况下你应该使用 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()
      }
    })
  }
)