根据输入的日期更改传单图上的数据(R,S)

根据输入的日期更改传单图上的数据(R,S),r,shiny,leaflet,R,Shiny,Leaflet,我正在尝试使用R创建一个闪亮的应用程序,通过传单在地图上绘制坐标数据。数据也有日期戳,我希望能够根据用户的选择绘制特定日期的坐标。我对R和Shinny都是全新的,所以非常感谢大家的帮助。这里是数据帧的一个片段 Date | InitialLat | InitialLong | NewLat | NewLong | 13/05/16 | 53.477403 | -2.230932 | 51.527953 | -0.13216 | 13/05/16 |

我正在尝试使用R创建一个闪亮的应用程序,通过传单在地图上绘制坐标数据。数据也有日期戳,我希望能够根据用户的选择绘制特定日期的坐标。我对R和Shinny都是全新的,所以非常感谢大家的帮助。这里是数据帧的一个片段

 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)
我想要达到的是

  • 用户选择一个日期
  • 日期的格式已更改为“%d/%m/%y”
  • 然后使用输入的日期搜索数据框(cleanData),以创建一个新的数据框(dailyData),该数据框仅包含所选日期的横向/纵向坐标
  • 修剪后的数据框被输入传单地图并显示

日期输入工作正常,我可以以正确的格式获取日期,但当我尝试使用它搜索cleanData以创建dailyData时,它不起作用,我无法找到它。我做错了什么?作为记录,我能够让它在Shiny之外工作-我手动更改了代码中的日期,并通过传单绘制了相应的坐标。

我修改了您的代码。看看这是不是你真正想要的

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)
库(闪亮)
图书馆(单张)

cleanData在一位精通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)

cleanData嗨,我实现了你的修改,但很抱歉,我不明白它们是做什么的。你能解释一下吗?@Calastar我添加了一些评论。希望你能理解。关于更多的细节,你可以按照这个抱歉@SBista,但我完全被难住了。我无法理解反应性功能。我在Shinny RStudio网站和Youtube上观看了该教程,并阅读了大量相关文档。我感谢你的帮助,但我觉得我离我需要的解决方案还有一段距离。你的反应功能有一个错误。它应该是被动的({})…缺少大括号被动是一个返回数据的函数,而不是数据本身。要获取数据,请像下面这样调用它
传单(dailyData())
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)
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)