Загрузите CSV с fileInput, отфильтруйте его данные с помощью dateInput и используйте результаты в виде карты Leaflet. - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу загрузить файл в мое блестящее приложение, я хочу отфильтровать этот файл с помощью dateInput и добавить результат на карту Leaflet. Тем не менее, я не могу найти пример, и все мои попытки не сработали. В нем говорится, что файл не является поддельным. Я был бы очень признателен за любую помощь!

Я считаю, что проблема в разделе подачи. Мне нужно загрузить файл CSV и затем каким-то образом я должен применить фильтр даты к загруженному мной CSV. Затем эти отфильтрованные данные будут go в Leaflet.

Вот мой код:

...

library(shiny)
library(shinydashboard)
library(leaflet)
library(RColorBrewer)
library(leaflet.extras)

library(rgdal)
library(DT)



ui <- fluidPage(
  titlePanel(p("Spatial app", style = "color:#3474A7")),
  sidebarLayout(
    sidebarPanel(
      fileInput(
        inputId = "filedata",
        label = "Upload data. Choose csv file",
        accept = c(".csv")
      ),

      checkboxInput(
        inputId = "positive",
        label = "Positive",
        value = FALSE
      ),
      checkboxInput(
        inputId = "class_positive",
        label = "class",
        value = FALSE
      ),
      dateInput(inputId = "date",
                label="Insira a Data",
                value = NULL, 
                min=Sys.Date()-20,
                max = Sys.Date()+20, 
                textOutput("seldate"), 
                format = "yyyy-mm-dd"
      ),

      p("Made with", a("Shiny",
                       href = "http://shiny.rstudio.com"
      ), "."),
      img(
        src = "imageShiny.png",
        width = "70px", height = "70px"
      )
    ),

    mainPanel(
      leafletOutput(outputId = "map"),
      leafletOutput("mymap", height = 500),

      DTOutput(outputId = "table")

    )
  )
)



server <- function(input, output) {


  data <- reactive({

    read.csv(input$filedata$datapath)
  })



  output$table <- renderDT(data())

  output$mymap <- renderLeaflet({


    leaflet(cities) %>% 
      setView(lng = -45, lat = 22, zoom = 2) 
      addTiles() 

  })

  rawData <- eventReactive(input$filedata, {
    read.csv(input$filedata$datapath)

  })



  pal <- reactive({colorNumeric(
    palette = c('gold', 'orange', 'dark orange', 'orange red', 'red', 'dark red'),
    domain = req(rawData$positive))
  })

  pal2 <- reactive({colorFactor(
    palette = c('blue', 'yellow', 'red'),
    domain = req(rawData$class_positive))
  })


  a_data <- eventReactive(input$filedata, {
    <-read.csv2(input$filedata$datapath)

  })

  observe({

    proxy <- leafletProxy("mymap", data = a_data )
    proxy %>% clearMarkers()

    if (input$positive == TRUE) {

      proxy %>% clearMarkers() %>% clearShapes()

      proxy %>% addCircles(data = a_data(), lat = ~ longitude,
                           lng = ~ latitude, weight = 1, 
                           radius = ~sqrt(positive)*25000, 
                           popup = ~Place, 
                           label = ~Place, 
                           color = ~pal, fillOpacity = 0.5) 
    }
    else {
      proxy %>%  clearMarkers() %>% clearControls() %>%  clearMarkerClusters() %>% clearShapes()

    }
  })


}


shinyApp(ui = ui, server = server)

...

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

спасибо за ваш быстрый ответ, и я извиняюсь за то, что не предоставил рабочие примеры, но, в принципе, подойдет любой файл с датой и любым другим столбцом.

В моем конкретном случае c, чтение данных и помещение в таблицу не было проблемой. Моя проблема - отфильтровать по дате и обновить карту.

Когда я использую «данные» (необработанные данные, вставленные с помощью fileInput), карта работает ...

, когда я использую data_filteres (то есть данные с указанным c фильтром даты), тогда все падает, когда я отмечаю флажок с именем «положительный»

И другая интересная вещь, когда я читаю файл CSV (без fileInput, но с обычным кодом, таким как read .csv), фильтр даты работал так же, как и раньше. Тем не менее, мне нужно, чтобы карта позволяла пользователю вставлять свои данные и динамически фильтровать по дате или по любому другому атрибуту ... Я видел десятки примеров на форумах, но ни один из них, похоже, не решал эту конкретную проблему c. Это действительно невозможно сделать? Я думаю, что есть обходной путь ... возможно, создание кнопки для чтения сценария и создания CSV, уже отфильтрованного по дате ... но это решение не будет столь же хорошо ... я очень ценю любую помощь

Реальная проблема заключается в том, что эта часть кода здесь:

output$mymap <- renderLeaflet({

    leaflet(data_filtered) %>% 
      setView(lng = -45, lat = 22, zoom = 2)  %>% #setting the view over ~ center of Brazil
      addTiles() 

  })



  observe({

    proxy <- leafletProxy("mymap", data = data_filtered )
    proxy %>% clearMarkers()

    if (input$positive == TRUE) {

      proxy %>% clearMarkers() %>% clearShapes()


      proxy %>% addCircles(data = data_filtered(), lat = ~ longitude,
                           lng = ~ latitude, weight = 1, 
                           radius = ~sqrt(positive)*25000, 
                           popup = ~Place, 
                           label = ~Place, 
                           color = ~pal, fillOpacity = 0.5) 
    }
    else {
      proxy %>%  clearMarkers() %>% clearControls() %>%  clearMarkerClusters() %>% clearShapes()

    }
  })
0 голосов
/ 22 апреля 2020

Не уверен, что могу понять, в чем заключается ваша проблема, но я создал упрощенный пример, который, я надеюсь, на месте: мой вывод: вы не можете фильтровать реактивный объект данных по дате. Было бы здорово, если бы вы предоставили воспроизводимый пример. Проверьте эту ссылку: { ссылка }

Сначала я создал небольшой CSV-файл с двумя столбцами: Дата, Значение. У нас будет что почитать. Файл содержит даты от 01.01.2020 до сегодняшнего дня и случайные числа.

Кроме того, я использую пакет DT, который, как я считаю, дает более надежные результаты по сравнению с функциями shiny:datatable.

Приведенный ниже код позволяет мне читать файлы csv, убедиться, что столбец «Дата» правильно отформатирован и сделать его доступным как реактивный объект. В коде сервера я читаю дату и фильтрую реактивный объект так, что сохраняются только наблюдения с датой, превышающей выбранную дату. DT:renderDataTable впоследствии отображает таблицу данных. Это то, что вы искали?

ui.R

library(shiny)

shinyUI(
  fluidPage(
  titlePanel("demo code"),
  sidebarLayout(
    sidebarPanel(
      fileInput(
        inputId = "filedata",
        label = "Upload data. Choose csv file",
        accept = c(".csv")
      ),
      dateInput(inputId = "date",
                label="Insert a Date",
                value = NULL, 
                min = as.Date("2020/01/01"),
                max = Sys.Date()+20, 
                textOutput("seldate"), 
                format = "yyyy-mm-dd"
      )
    ),
  mainPanel(
    DT::dataTableOutput('table')
  )
 )
)
)

server.R

library(shiny)
library(dplyr)
library(DT)

shinyServer(function(input, output, session) {


  data <- reactive({
    req(input$filedata)
    read.csv(input$filedata$datapath, stringsAsFactors = FALSE) %>%
      mutate(Date = as.Date(Date, format = "%d/%m/%Y"))
  })

  observeEvent(input$date, {
    date <- input$date
    #browser()
    data_filtered <- data() %>%
      filter(Date > date)
    output$table <- DT::renderDataTable(data_filtered,
                                    options = list(pageLength = 5))

  })

}
)

А вот скриншот, чтобы увидеть, как выглядит это простое блестящее приложение как.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...