【问题标题】:Default updateDateInput doesn't work going forward默认 updateDateInput 无法继续工作
【发布时间】:2020-07-12 18:09:08
【问题描述】:

我有一个简单的应用程序,它使用动态 UI 元素 updateDateInput,以确保用户只能选择指定年份的日期。所选日期应始终默认为所选年份的第一天。

library(shiny)
library(tidyverse)
library(lubridate)

ui <- fluidPage(
  selectInput("year", "Select Year:",
              choices = 2010:2020, selected = 2015),
  dateInput("date", "Select Date:", value = NULL)
)

server <- function(input, output, session) {
  observeEvent(input$year, 
               updateDateInput(session, "date", 
                               min = ymd(paste(input$year, "01-01", sep = "-")),
                               max = ymd(paste(input$year, "12-31", sep = "-")),
                               value = ymd(paste(input$year, "01-01", sep = "-"))))
}

shinyApp(ui, server)

将所选年份向后移动(例如 2015 - 2014 年)时,所选日期会自动更新为该月的第一天。但是,当用户将日期向前移动时,从 2015 年到 2016 年,选定的日期默认为 null,用户需要手动搜索才能获得当年的日期。

谁能帮我弄清楚为什么会这样?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    这是一个令人讨厌的问题,当它发生在我身上时,我花了很长时间才找到它。问题是updateDateInput 似乎进行了非原子 的更改。也就是说,它们不会同时发生,而是顺序发生。因此,当一次更改输入小部件的多个参数时,value 可能会暂时无效。

    诀窍是确保所选日期在更新期间始终有效。这意味着分两个阶段进行更改,其顺序取决于您是在时间上前进还是后退。

    这是一个可行的解决方案。

    library(shiny)
    library(tidyverse)
    library(lubridate)
    
    ui <- fluidPage(
      selectInput("year", "Select Year:",
                  choices = 2010:2020, selected = 2015),
      dateInput("date", "Select Date:", value = NULL)
    )
    
    server <- function(input, output, session) {
      observeEvent(input$year, {
        req(input$date, input$year)
        
        # Are we going backwards or forwards?
        if (as.numeric(input$year > year(input$date))) {
          updateDateInput(
            session, 
            "date", 
            max = ymd(paste(input$year, "12-31", sep = "-")),
            value = ymd(paste(input$year, "01-01", sep = "-")),
          )
          updateDateInput(
            session, 
            "date", 
            min = ymd(paste(input$year, "01-01", sep = "-"))
          )
        } else {
          updateDateInput(
            session, 
            "date", 
            min = ymd(paste(input$year, "01-01", sep = "-")),
            value = ymd(paste(input$year, "01-01", sep = "-"))
          )
          updateDateInput(
            session, 
            "date", 
            max = ymd(paste(input$year, "12-31", sep = "-"))
          )
        }
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 很抱歉响应缓慢。这很棒。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多