1

我有一个简单的闪亮应用程序,可以从 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 = ".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)
    })
  }
)
4

1 回答 1

3

renderTable 用于创建要在 UI 中显示的反应表。你想要的是有一个可以在其他反应式表达式中使用的变量来触发它们更新,在这种情况下你应该使用reactive or reactiveValue,例如看这里; 页面下方的 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()
      }
    })
  }
)
于 2017-12-22T09:51:14.680 回答