Это неприятная проблема, и мне потребовались годы, чтобы разобраться, когда это случилось со мной. Проблема в том, что updateDateInput
, похоже, вносит изменения, отличные от atomi c. То есть они возникают не сразу, а последовательно. Следовательно, при одновременном изменении более чем одного параметра виджета ввода возможно, что 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)