Не удается обновить второй dateRangeInput, если я вручную изменю первый dateRangeInput в R Shiny

#r #shiny

#r #блестящий

Вопрос:

Ниже у меня есть пример кода, показывающий два dateRangeInput . Выбранные даты второго dateRangeInput зависят от первого dateRangeInput . Вот та же версия на Shinyapps.io (https://yuchenw.shinyapps.io/shiny_daterange /).

Странное поведение, которое я хотел бы продемонстрировать, заключается в том, что если я вручную изменил значения даты в первом, dateRangeInput второе dateRangeInput становится NA.

Например, если я выбрал дату в первом dateRangeInput , приложение может успешно обновить второй dateRangeInput .

введите описание изображения здесь

введите описание изображения здесь

Однако, если я вручную удалю значения даты в поле ввода первого dateRangeInput , а затем введу новое значение даты, значения даты во втором dateRangeInput станут NA такими.

введите описание изображения здесь

введите описание изображения здесь

Это кажется нежелательным поведением, поскольку я ожидаю, что эти два метода выбора (с использованием календаря или изменения вручную) должны быть одинаковыми. Пожалуйста, дайте мне знать, если я смогу исправить это поведение.

 library(shiny)

# Create the ui
ui <- fluidPage(
  dateRangeInput(inputId = "date_input1", label = "Select Date Range 1",
                 start = "2000-01-01", end = "2019-12-31",
                 min = "2000-01-01", max = "2019-12-31"),
  verbatimTextOutput(outputId = "date_output1"),
  dateRangeInput(inputId = "date_input2", label = "Select Date Range 1",
                 start = "2000-01-01", end = "2019-12-31",
                 min = "2000-01-01", max = "2019-12-31"),
  verbatimTextOutput(outputId = "date_output2")
)

# Create the server
server <- function(session = session, input = input, output = output){
  # Update the date selection in date_input2
  observe({
    updateDateRangeInput(session = session, inputId = "date_input2", label = "Select Date Range 1",
                    start = input$date_input1[[1]], end = input$date_input1[[2]],
                    min = "2000-01-01", max = "2019-12-31")
  })
  
  # Print the selected date
  output$date_output1 <- renderText({
    paste(input$date_input1[[1]], input$date_input1[[2]], sep = " - ")
  })
  
  output$date_output2 <- renderText({
    paste(input$date_input2[[1]], input$date_input2[[2]], sep = " - ")
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
  

Ответ №1:

Добавьте эту строку перед вызовом updateDateRangeInput

 req(input$date_input1[[1]],input$date_input1[[2]])
  

Проблема в том, что когда вы редактируете вручную, какое-то время дата формируется неправильно и по какой-то причине постоянно нарушает ввод второй даты. req() Вызов просто настаивает на том, что там есть правильные значения, прежде чем обновлять второй ввод даты.