这是一个令人讨厌的问题,当它发生在我身上时,我花了很长时间才找到它。问题是updateDateInput
似乎做了一些未做的改变atomic。也就是说,它们不会同时发生,而是依次发生。因此,当同时更改输入小部件的多个参数时,有可能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)