R 默认更新的数据输入不';我无法继续前进

R 默认更新的数据输入不';我无法继续前进,r,shiny,R,Shiny,我有一个简单的应用程序,它使用了一个动态UI元素,updateDateInput,以确保用户只能选择指定年份中的日期。所选日期应始终默认为所选年份的第一天 library(shiny) library(tidyverse) library(lubridate) ui <- fluidPage( selectInput("year", "Select Year:", choices = 2010:2020, selec

我有一个简单的应用程序,它使用了一个动态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)
库(闪亮)
图书馆(tidyverse)
图书馆(lubridate)

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, {
    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)
库(闪亮)
图书馆(tidyverse)
图书馆(lubridate)

很抱歉反应太慢。这太棒了。非常感谢!