【问题标题】:Adjust date format in Shiny在 Shiny 中调整日期格式
【发布时间】:2021-08-25 00:28:51
【问题描述】:

我想要一些关于以下问题的帮助:下面的代码运行正常。如果从我的df database 中选择三个日期之一,它会生成散点图。到那时还可以。

如您所见,我的df database 的日期是 yyyy-mm-dd 格式。但是,如果我以 dd-mm-yyyy 格式插入数据库,则会出现错误。有什么办法可以标准化吗?

我留下了两个df databases,一个是yyyy-mm-dd格式的,一个是dd-mm-yyyy格式的供你测试。

library(shiny)
library(shinythemes)
library(dplyr)
library(ggplot2)
library(tidyr)
library(lubridate)

function.cl<-function(dt){
  df <- structure(
    list(date = c("2021-08-01","2021-08-01","2021-08-01","2021-08-01","2021-08-01",
                  "2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08",
                  "2021-08-13","2021-08-13","2021-08-13","2021-08-13","2021-08-13"),
         Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday",
                 "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"),
         D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8), 
         DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7),  DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5),
         DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4),  DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7), 
         DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8),  DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)), 
    class = "data.frame", row.names = c(NA, -16L))
  
  
  # df <- structure(
  #   list(date = c("01-08-2021","01-08-2021","01-08-2021","01-08-2021","01-08-2021",
  #                 "08-08-2021","08-08-2021","08-08-2021","08-08-2021","08-08-2021","08-08-2021",
  #                 "13-08-2021","13-08-2021","13-08-2021","13-08-2021","13-08-2021"),
  #        Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday",
  #                "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"),
  #        D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8),
  #        DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7),  DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5),
  #        DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4),  DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7),
  #        DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8),  DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)),
  #   class = "data.frame", row.names = c(NA, -16L))

  
  scatter_date <- function(dt, dta = df) {
    dta %>%
      mutate(date = ymd(date)) %>%
      filter(date == ymd(dt)) %>%
      summarize(across(starts_with("DR"), sum)) %>%
      pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>%
      mutate(name = as.numeric(name)) %>%
      plot(xlab = "Days", ylab = "Types", xlim = c(0, 7))
  }  
  Plot1<-scatter_date(dt)
  
  return(list(
    "Plot1" = Plot1, 
    date = df$date
  ))
}

ui <- fluidPage(
  
  ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                          br(),
                          
                          tabPanel("",
                                   sidebarLayout(
                                     sidebarPanel(
                                       
                                       uiOutput("date"),
                                       br(),
                                     ),
                                     
                                     mainPanel(
                                       tabsetPanel(
                                         tabPanel("",plotOutput("Graph",width = "95%", height = "600"))),
                                     ))
                          )))


server <- function(input, output,session) {
  data <- reactive(function.cl("2021-08-01"))
  
  output$date <- renderUI({
    all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day")
    disabled <- as.Date(setdiff(all_dates, as.Date(data()$date)), origin = "1970-01-01")
    
    dateInput(input = "date", 
              label = "Select Date",
              min = min(data()$date),
              max = max(data()$date),
              value = max(data()$date),
              format = "dd-mm-yyyy",
              datesdisabled = disabled)
  })
  
  output$Graph <- renderPlot({
    req(input$date)
    function.cl(input$date)[["Plot1"]]
    
  })
  
}

shinyApp(ui = ui, server = server)

【问题讨论】:

  • 如果您无法修复问题的根源(数据源:修复不一致的日期格式的最佳位置是在创建数据时正确处理),有一些软件包可以提供帮助):例如lubridateanytime。这些都不是绝对必要的,可以迭代候选格式,例如我的previous answer
  • 但是这个问题(如何处理各种日期格式)确实与shiny 无关,我建议你在R 控制台上解决这个问题,然后将该解决方案移植到shiny 应用程序中.
  • 感谢您的回答@r2evans。我做错了。我把代码放在闪亮的地方,因为它正在工作,唯一的问题是关于 dd-mm-yyyy 格式的日期。不过谢谢回复!

标签: r shiny


【解决方案1】:

您可以使用lubridate 中的parse_date_time 并传递日期可以采用的不同格式。

library(tidyverse)
library(lubridate)

library(shiny)
library(shinythemes)
library(dplyr)
library(ggplot2)
library(tidyr)
library(lubridate)

function.cl<-function(dt){
  df <- structure(
       list(date = c("01-08-2021","01-08-2021","01-08-2021","01-08-2021","01-08-2021",
                     "08-08-2021","08-08-2021","08-08-2021","08-08-2021","08-08-2021","08-08-2021",
                     "13-08-2021","13-08-2021","13-08-2021","13-08-2021","13-08-2021"),
            Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday",
                    "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"),
            D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8),
            DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7),  DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5),
           DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4),  DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7),
            DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8),  DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)),
       class = "data.frame", row.names = c(NA, -16L))
  
  df$date <- parse_date_time(df$date, c('ymd', 'dmy'))
  
  scatter_date <- function(dt, dta = df) {
    dta %>%
      filter(date == ymd(dt)) %>%
      summarize(across(starts_with("DR"), sum)) %>%
      pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>%
      mutate(name = as.numeric(name)) %>%
      plot(xlab = "Days", ylab = "Types", xlim = c(0, 7))
  }  
  Plot1<-scatter_date(dt)
  
  return(list(
    "Plot1" = Plot1, 
    date = df$date
  ))
}

ui <- fluidPage(
  
  ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                          br(),
                          
                          tabPanel("",
                                   sidebarLayout(
                                     sidebarPanel(
                                       
                                       uiOutput("date"),
                                       br(),
                                     ),
                                     
                                     mainPanel(
                                       tabsetPanel(
                                         tabPanel("",plotOutput("Graph",width = "95%", height = "600"))),
                                     ))
                          )))


server <- function(input, output,session) {
  data <- reactive(function.cl("2021-08-01"))
  
  output$date <- renderUI({
    all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day")
    disabled <- as.Date(setdiff(all_dates, as.Date(data()$date)), origin = "1970-01-01")
    dateInput(input = "date", 
              label = "Select Date",
              min = min(data()$date),
              max = max(data()$date),
              value = max(data()$date),
              format = "dd-mm-yyyy",
              datesdisabled = disabled)
  })
  
  output$Graph <- renderPlot({
    req(input$date)
    function.cl(input$date)[["Plot1"]]
    
  })
  
}

shinyApp(ui = ui, server = server)

【讨论】:

  • Ronak 感谢您的回复。你确定它对你有用吗?因为对我来说没有。如果不麻烦的话,你可以把所有的代码都放上来,这样我比较容易看对不对。
  • 抱歉,我没有测试整个应用程序,因为我认为问题是关于如何处理不同格式的日期。如果将代码中的两个数据框替换为df1df2,并将上述函数用作scatter_date('2021-08-01', df1)scatter_date('2021-08-01', df2)。它似乎有效并给出了预期的输出。您可以尝试不同的日期。
  • 按照你说的方式,我设法将图形与闪亮的图形分开生成。但我的想法是在闪亮上显示它,所以我的 Plot1 会是什么样子,考虑到我只会使用第二个数据库 (df2)。你能帮助我吗?如果你觉得有必要,我可以问一个新问题。再次感谢您。
  • 编辑了答案以包含完整的代码。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多