【问题标题】:Shiny Dashboard Date Slider Input闪亮的仪表板日期滑块输入
【发布时间】:2020-07-20 21:06:42
【问题描述】:

我是 R 和 Shiny 的新手,遇到了几个小时都无法解决的问题。

我有一个数据集,可以在仪表板上显示每天的咖啡消耗量,效果很好。该图是一个 ggplot geom_line 图。

但现在我希望能够使用两个滑块来更改时间段。 滑块我也设法做到了,但是移动滑块时绘图不会改变。

我还怀疑我的日期格式有误。

我做错了什么? 感谢您的帮助

RawData Dataset

library(shiny)
library(dplyr)
library(data.table)
library(ggplot2)

ui <- shinyUI(fluidPage(

  # Application title
  titlePanel("Coffee consumption"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("DatesMerge",
                  "Dates:",
                  min = as.Date("2018-01-22","%Y-%m-%d"),
                  max = as.Date("2020-04-04","%Y-%m-%d"),
                  value= c(as.Date("2018-01-22","%Y-%m-%d"),as.Date("2020-04-04","%Y-%m-%d")),
                  timeFormat="%Y-%m-%d")
    ),
    mainPanel(

      plotOutput("plot_daycount"),
      tableOutput("structure"),
      tableOutput("rawdata"),
      tableOutput("dayconsumption")) 

  )
)
)


# RawData import

coffeedata = fread("C:/temp/ProductList.csv")

setDF(coffeedata)

coffeedata$Date = as.Date(coffeedata$Date, "%d.%m.%Y")

# Products a day counter
countcoffee <- function(timeStamps) {
  Dates <- as.Date(strftime(coffeedata$Date, "%Y-%m-%d"))
  allDates <- seq(from = min(Dates), to = max(Dates), by = "day")
  coffee.count <- sapply(allDates, FUN = function(X) sum(Dates == X))
  data.frame(day = allDates, coffee.count = coffee.count)}

# Making a DF with day consumption
daylicounter = countcoffee(df$coffee.date)


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


  output$structure = renderPrint({
    str(coffeedata)
  })

  # Raw Data
  output$rawdata = renderTable({
    head(coffeedata)
  })

  output$dayconsumption = renderTable({
    head(daylicounter)
  })


  # GGPLOT2
  output$plot_daycount = renderPlot({

    DatesMerge = input$DatesMerge

    ggplot(daylicounter[daylicounter == DatesMerge], aes(daylicounter$day, daylicounter$coffee.count)) + 
           geom_line(color = "orange", size = 1) 
           scale_x_date(breaks = "3 month", 
                       date_labels = "%d-%m-%Y")


# Try outs    
#   ggplot(daylicounter[month(day) == month(DatesMerge)], mapping = aes(day = day)) + 
#      geom_line(color = "orange", size = 1) 
#      scale_x_date(breaks = "3 month", 
#                  date_labels = "%d-%m-%Y")
  })

})

shinyApp(ui, server)


感谢您的帮助

【问题讨论】:

  • 如果您有其他 cmets/问题,请随时使用 cmets 部分(或在 SO 上发布新问题)而不是添加答案。关于您的最后一个问题,请参阅我编辑的答案。祝你好运!

标签: r date shiny slider


【解决方案1】:

正如@Kevin 所述,在对数据进行子集化时,您需要使用input$DatesMerge[1]input$DatesMerge[2]。为清楚起见,这可以在单独的步骤中完成。在你的服务器上尝试这样的事情:

output$plot_daycount = renderPlot({
  DatesMerge <- as.Date(input$DatesMerge, format = "%Y-%m-%d")
  sub_data <- subset(daylicounter, day >= DatesMerge[1] & day <= DatesMerge[2])
  ggplot(sub_data, aes(x = day, y = coffee.count)) + 
    geom_line(color = "orange", size = 1) +
    scale_x_date(breaks = "3 month", date_labels = "%d-%m-%Y")
})

编辑 OP 提出了其他问题:

为什么我的日期格式使用 str(coffeedata) 看起来很正常,但使用 head(coffeedata) 日期只是一个数字?

renderTable 使用 xtable 可能在日期方面有问题。您可以通过先转换为字符(一个选项)来正确显示日期:

output$rawdata = renderTable({
  coffeedata$Date <- as.character(coffeedata$Date)
  head(coffeedata)
})

output$dayconsumption = renderTable({
  daylicounter$day <- as.character(daylicounter$day)
  head(daylicounter)
})

查看有关此主题的其他问题:

as.Date returns number when working with Shiny

R shiny different output between renderTable and renderDataTable

【讨论】:

  • 它的工作!非常感谢@Ben 和@Kevin!惊人的社区!非常感谢!
【解决方案2】:

欢迎来到 R 和 Shiny,您的开端很好。几件事:

  1. 我不建议你在闪亮时使用=,大多数情况下你要使用&lt;-
  2. 为了简化代码,没有理由添加像DatesMerge 这样的变量。它没有增加任何价值(至少在上面的代码中)
  3. 对于双滑块,您需要告诉 Shiny 选择哪一端。 input$DatesMerge 没有任何意义,但 input$DatesMerge[1] 有。
  4. 在寻求帮助时,最好在代码本身中添加数据子集。您往往会获得更多帮助,并且对于试图帮助的人来说更容易运行(像我一样,我懒得下载文件并将其放在文件夹中,所以我没有运行它)

在对数据进行子集化时,您需要在滑块中考虑一系列日期;在对数据进行子集化时,您还可以使用 ,

ggplot(daylicounter[daylicounter %in% input$DatesMerge[1]:input$DatesMerge[2],], aes(daylicounter$day, daylicounter$coffee.count)) + 
       geom_line(color = "orange", size = 1) +
       scale_x_date(breaks = "3 month", 
                   date_labels = "%d-%m-%Y")

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2015-04-22
    • 2018-03-07
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多