2017-02-02 16 views
0

Я пытаюсь создать приложение Shiny с использованием R, которое отображает данные координат на карте с помощью листовки. Данные также имеют отметки даты, и я хочу иметь возможность строить координаты конкретных дней, выбранные пользователем. Я совершенно новый и для R, и для Shiny, поэтому вся помощь приветствуется. Вот фрагмент dataframe;Измените данные на листе на основе введенной даты (R, Shiny)

Date | InitialLat | InitialLong | NewLat | NewLong | 
13/05/16 | 53.477403 | -2.230932 | 51.527953 | -0.13216 | 
13/05/16 | 53.490599 | -2.312568 | 53.485655 | -2.237405 | 
14/05/16 | 53.371535 | -2.23148 | 53.32803 | -2.246991 | 
14/05/16 | 53.371535 | -2.23148 | 53.32803 | -2.246991 | 
15/05/16 | 53.371535 | -2.23148 | 53.32803 | -2.246991 | 
15/05/16 | 53.371535 | -2.23148 | 53.32803 | -2.246991 | 
16/05/16 | 53.478316 | -2.23270 | 53.42814 | -2.17458 | 
16/05/16 | 53.48868 | -2.21839 | 53.47737 | -2.23091 | 

Мой код до сих пор:

library(shiny) 
library(leaflet) 

cleanData <- read.csv(file="CleanedJourneyData.csv", header=TRUE, sep=",") 
cleanData$X <- NULL 

ui <- fluidPage(
    dateInput(inputId = "n_date", label="Select a date", value = "2016-05-13", min = "2016-05-13", max = "2016-10-24", 
      format = "dd-mm-yyyy", startview = "month", 
      language = "en", width = NULL), 
    leafletOutput("map") 

) 

server <- function(input, output, session) { 

    dailyData <- reactive(cleanData[cleanData$Date == format(input$n_date, '%d/%m/%y')]) 

    output$map <- renderLeaflet({ leaflet(dailyData) %>% addTiles() %>% 
     addMarkers(~InitialLong, ~InitialLat, popup = "Start") }) 
} 

shinyApp(ui, server) 

Проблема заключается в линии;

dailyData <- reactive(cleanData[cleanData$Date == format(input$n_date, '%d/%m/%y')]) 

Ошибки я получаю:

Error: no applicable method for 'doResolveFormula' applied to an object of class "reactive" 

То, что я пытаюсь достичь;

  • пользователь выбирает дату
  • формат даты изменяется на «% д /% м /% г»
  • введенный дата затем используется для поиска dataframe (cleanData) создать новый dataframe (dailyData) чуть широту/долготу координат с этой выбранной датой
  • обрезанными вниз dataframe вводится в карту листовки и отображается

Ввод даты отлично работает, я могу получить дату в правильном формате, но когда я пытаюсь использовать это для поиска cleanData, чтобы создать dailyData, он не работает, и я не могу понять это. Что я делаю не так? Для записи я смог заставить это работать за пределами Shiny - я вручную изменил дату в коде, и соответствующие координаты были нанесены через листовку.

+0

Ошибка в вашей реактивной функции. Он должен быть реактивным ({}) .. отсутствуют фигурные скобки – MLavoie

+0

Реактивная функция, которая возвращает данные, а не данные. Чтобы получить данные, назовите его так: 'leaflet (dailyData())' – HubertL

ответ

1

Я изменил ваш код. Просто посмотрите, действительно ли это то, что вы действительно хотите.

library(shiny) 
library(leaflet) 

cleanData <- read.csv(file="D:/CleanedJourneyData.csv", header=TRUE, sep=",") 
cleanData$X <- NULL 

ui <- fluidPage(
    dateInput(inputId = "n_date", label="Select a date", value = "2016-05-13", min = "2016-05-13", max = "2016-10-24", 
      format = "dd-mm-yyyy", startview = "month", 
      language = "en", width = NULL), 
    leafletOutput("map") 

) 

server <- function(input, output, session) { 

    dailyData <- reactive(cleanData[cleanData$Date == format(input$n_date, '%d/%m/%y'), ]) 

    # I have implemented the change here, instead of using dailyData, I've used isolate(dailyData()) 
    output$map <- renderLeaflet({ leaflet(isolate(dailyData())) %>% addTiles() %>% 
            addMarkers(~InitialLong, ~InitialLat, popup = "Start") }) 

} 

shinyApp(ui, server) 

Надеюсь, это поможет!

+0

Привет, я внедрил ваши изменения, но, к сожалению, я не понимаю, что они делают. Не могли бы вы объяснить? – Calastar

+0

@Calastar Я добавил комментарии. Надеюсь ты понимаешь. Для получения дополнительной информации вы можете следовать этой [link] (https://shiny.rstudio.com/reference/shiny/latest/reactive.html) – SBista

+0

Извините @SBista, но я полностью в тупике. Я не могу разобраться в реактивных функциях.Я смотрел учебник на сайте Shiny RStudio, а также на Youtube и читал много документации по нему. Я ценю вашу помощь, но чувствую, что я не ближе к решению, которое мне нужно. – Calastar

0

С помощью коллеги, хорошо разбирающегося в R, я нашел ответ на свой вопрос;

cleanData <- read.csv(file="/Users/CharlesPowell/R/CleanedJourneyData.csv", header=TRUE, sep=",") 
cleanData$X <- NULL 

r_colors <- rgb(t(col2rgb(colors())/255)) 
names(r_colors) <- colors() 

ui <- fluidPage(
    dateInput(inputId = "n_date", label="Select a date", value = "2016-05-13", min = "2016-05-13", max = "2016-10-24", 
      format = "dd-mm-yyyy", startview = "month", 
      language = "en", width = NULL), 
    leafletOutput("map") 

) 

server <- function(input, output, session) { 

    numrow <- reactive({cleanData$Date == format(input$n_date, '%d/%m/%y')}) 
    dailyData <- reactive({cbind(cleanData[numrow(),], Observation = seq(1:sum(numrow())))}) 

    z <- reactive({as.data.frame(gather(data=dailyData()[, 2:dim(dailyData())[2]], measure, val, -Observation) %>% group_by(Observation) %>% 
    do(data.frame( lat=c(.[["val"]][.[["measure"]]=="InitialLat"], 
          .[["val"]][.[["measure"]]=="NewLat"]), 
        long = c(.[["val"]][.[["measure"]]=="InitialLong"], 
           .[["val"]][.[["measure"]]=="NewLong"]))))}) 

    y <- reactive({points_to_line(z(), "long", "lat", "Observation")}) 

    output$map <- renderLeaflet({ leaflet(dailyData()) %>% addTiles() %>% 
     addMarkers(~InitialLong, ~InitialLat, popup = "Start") %>% 
    addPolylines(data = y()) }) 

} 

shinyApp(ui, server) 

Вы можете видеть, что я также добавил функциональные возможности для создания линий точка-точка с помощью функции, созданной Kyle Walker. https://rpubs.com/walkerke/points_to_line

Итак, теперь, когда я меняю введенную дату, соответствующие данные этой даты нанесены на карту листовки с линиями, соединяющими начальную и конечную точки.