Блестящий ввод данных с панели управления датой - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в R и Shiny и у меня есть проблема, которую я не могу решить часами.

У меня есть набор данных, из которого я отображаю ежедневное потребление кофе на приборной панели, которая работает очень хорошо. График представляет собой диаграмму ggplot geom_line.

Но теперь я хочу иметь возможность изменять период времени с помощью двух ползунков. Слайдеры мне тоже удалось сделать, но график не меняется при перемещении слайдера.

Я также подозреваю, что у меня ошибка с форматом даты.

Что я делаю неправильно? Спасибо за помощь

Набор данных RawData

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)


Я ценю вашу помощь

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Как отмечает @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) но с головой (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)
})

См. Другие вопросы по этой теме c:

as.Date возвращает число при работе с Shiny

R блестящий различный вывод между renderTable и renderDataTable

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

Добро пожаловать в R и Shiny, у вас хорошее начало. Несколько вещей:

  1. Я не рекомендую использовать = в блестящем, в большинстве случаев вы хотите использовать <-
  2. Для упрощения кода, нет причин добавлять переменная типа DatesMerge. Это не добавляет значения (по крайней мере, в приведенном выше коде)
  3. Для двойного слайдера вы должны указать блестящий, какой конец выбрать. 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...