【问题标题】:Adjust output for dates in Shiny在 Shiny 中调整日期的输出
【发布时间】:2021-08-08 23:57:15
【问题描述】:

以下APP运行正常。但是,我希望与日期相关的输出值有所不同,也就是说,而不是 2021-01-01 出现,我希望它们像这样出现:01-01-2021。显然,无需直接更改df database 并且输出为yes。

非常感谢!

library(shiny)
library(shinythemes)

function.cl<-function(df,date, d1,d2){
  
  df <- structure(
   list(date = c("2021-01-01","2021-01-02","2021-01-03","2021-01-04","2021-01-05"),
         d1 = c(0,1,4,5,6), d2 = c(2,4,5,6,7)),class = "data.frame", row.names = c(NA, -5L))
}    
ui <- fluidPage(
  
  ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                          br(),
                          
                          tabPanel("",
                                     sidebarLayout(
                                     sidebarPanel(
                                       
                                       selectInput("date", label = h4("Date"),""),
                                       selectInput("d1", label = h4("D1"),""),
                                       selectInput("d2", label = h4("D2"),""),
                                       br(),
                                       actionButton("reset", "Reset"),
                                     ),
                                     
                                     mainPanel(
                                     ))
                          )))


server <- function(input, output,session) {
  data <- reactive(function.cl())
  
  observe({
    updateSelectInput(session, "date",labe ="Date", unique(data()$date))
    updateSelectInput(session, "d1", label = "D1", unique(data()$d1))
    updateSelectInput(session, "d2", label = "D2", unique(data()$d2))
  })
  

}

shinyApp(ui = ui, server = server)

#新代码

library(shiny)
library(shinythemes)
library(openxlsx)
library(shinyBS)
library(shinyWidgets)
library(openxlsx)
library(writexl)
library(readxl)
library(DT)

ui <- fluidPage(
  
  ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                          br(),
                          
                          tabPanel("",
                                   fileInput("file", "Please upload a file", accept = c(".xlsx")),
                                   sidebarLayout(
                                     sidebarPanel(
                                       
                                       selectInput("date", label = h4("Date"),""),
                                       selectInput("d1", label = h4("D1"),""),
                                       selectInput("d2", label = h4("D2"),""),
                                       br(),
                                       
                                     ),
                                     
                                     mainPanel( 
                                     ))
                          )))


server <- function(input, output, session) {
  df1 <- reactiveValues(dat=NULL)
  
  data <- eventReactive(input$file, {
    if (is.null(input$file)) return(NULL)
    df <- read_excel(input$file$datapath)
    df
  })
  
  observe({
    df1$dat <- data()
  })
  
  observeEvent(input$file, {
    
    if (!is.null(df1$dat)) {
      data <- df1$dat
      updateSelectInput(session, "date", label = "Date", unique(data$Date))
      updateSelectInput(session, "d1", label = "D1", unique(data$D1))
      updateSelectInput(session, "d2", label = "D2", unique(data$D2))
    }
    
  })
  
}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    为什么不使用dateInput() input type 而不是selectInput()

    如果您只希望特定日期符合选择条件,您可以禁用dateInput() 中的其他日期。但是,这变成了slightly more complex,因为您无法使用updateDateInput() 函数更新datesdisabled 参数,我假设您想要美国风格的day-month-year 格式,但如果不是,您可以编辑格式。

    例如:

    library(shiny)
    library(shinythemes)
    
    function.cl<-function(df,date, d1,d2){
        df <- structure(
            list(date = c("2021-01-01","2021-01-02","2021-01-03","2021-01-04","2021-01-05"),
                 d1 = c(0,1,4,5,6), d2 = c(2,4,5,6,7)),class = "data.frame", row.names = c(NA, -5L))
    }    
    ui <- fluidPage(
        
        ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                                br(),
                                
                                tabPanel("",
                                         sidebarLayout(
                                             sidebarPanel(
                                                 
                                                 uiOutput("date"),
                                                 selectInput("d1", label = h4("D1"),""),
                                                 selectInput("d2", label = h4("D2"),""),
                                                 br(),
                                                 actionButton("reset", "Reset"),
                                             ),
                                             
                                             mainPanel(
                                             ))
                                )))
    
    
    server <- function(input, output,session) {
        data <- reactive(function.cl())
          
        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)
        })
    
        observe({
            updateSelectInput(session, "d1", label = "D1", unique(data()$d1))
            updateSelectInput(session, "d2", label = "D2", unique(data()$d2))
        })
    }
    
    shinyApp(ui = ui, server = server)
    

    编辑:或者,您刚刚将上述日期定义为字符串,因此您可以重新格式化字符串。

    即可以更改定义数据的函数:

    function.cl<-function(df,date, d1,d2){
        
        df <- structure(
            list(date = c("01-01-2021","01-02-2021","01-03-2021","01-04-2021","01-05-2021"),
                 d1 = c(0,1,4,5,6), d2 = c(2,4,5,6,7)),class = "data.frame", row.names = c(NA, -5L))
    }
    

    如果你真的想使用selectInput() 函数并且你真的希望日期为Date 类型而不是字符,你也可以在字符串和日期之间来回设置格式。

    例如:

    library(shiny)
    library(shinythemes)
    
    function.cl<-function(df,date, d1,d2){
        
        df <- structure(
            list(date = as.Date(c("01-01-2021","01-02-2021","01-03-2021","01-03-2021","01-05-2021"), format = "%m-%d-%Y"),
                 d1 = c(0,1,4,5,6), d2 = c(2,4,5,6,7)),class = "data.frame", row.names = c(NA, -5L))
    }    
    ui <- fluidPage(
        
        ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                                br(),
                                
                                tabPanel("",
                                         sidebarLayout(
                                             sidebarPanel(
                                                 
                                                 selectInput("date", label = h4("Date"),""),
                                                 selectInput("d1", label = h4("D1"),""),
                                                 selectInput("d2", label = h4("D2"),""),
                                                 br(),
                                                 actionButton("reset", "Reset"),
                                             ),
                                             
                                             mainPanel(
                                             ))
                                )))
    
    
    server <- function(input, output,session) {
        data <- reactive(function.cl())
        
        observe({
            updateSelectInput(session, "date",labe ="Date", unique(format(data()$date, format = "%m-%d-%Y")))
            updateSelectInput(session, "d1", label = "D1", unique(data()$d1))
            updateSelectInput(session, "d2", label = "D2", unique(data()$d2))
        })    
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 我喜欢你的第一种方式,使用 dateInput()。它变得更好了。但我想对你提供的这个新表格有所帮助。我有一个文件输入正在插入数据库的情况,我没有在代码中设置 df 。我将把这个与上面类似的新代码放在上面供您查看。我希望您能就使用 dateInput() 在此代码中的外观提供帮助。
    • 你为什么不把它标记为接受,和/或投票并发布一个关于你的新问题的新问题。如果你发布后链接在这里,我会看看我是否可以为你回答
    • 抱歉给您带来不便。我问了一个新问题,如果你能看一下,我将不胜感激。 stackoverflow.com/questions/68706475/…
    • 完全没问题。一分钟后我会看看你的另一个问题:)
    • 抱歉,我没有注意到您已经更新了上面的代码。为了清楚起见,我将更新我的答案,并在另一个问题中也回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多