我正在尝试创建一个日期输入,该输入会自动将输入的值更新为所选月份的月底。我遇到的问题是,当我运行第一段代码(如下)时,如果用户尝试通过输入日期来手动更改日期,他们将无法更改,因为输入会立即更新到月底在用户完成输入之前。
library(shinydashboard)
library(lubridate)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
dateInput(
inputId = "date",
label = "End of Month Date",
value = ceiling_date(x = Sys.Date() + 365, unit = "month") - 1,
startview = "year"
)
)
)
server <- function(input, output, session) {
observe({
if(is.Date(input$date) & length(input$date) > 0){
if(input$date != ceiling_date(input$date, unit = "month") - 1) {
updateDateInput(
session,
inputId = "date",
value = ceiling_date(x = input$date, unit = "month") - 1
)
}
}
})
}
shinyApp(ui, server)
因此,我尝试实现去抖动(如下所示 - 仅更改服务器代码),以便延迟输入更新,直到用户完成输入;但是,我遇到了一个问题。正如我所理解的那样,计时器不会在每次击键时重置。相反,计时器就像我使用油门功能一样运行,并在输入第一次更改时启动,并且在输入更改时不会重置。
server <- function(input, output, session) {
observe({
dateinputdelay <- debounce(r = reactive(input$date), millis = 2000)
if(is.Date(dateinputdelay()) & length(dateinputdelay()) > 0){
if(dateinputdelay() != ceiling_date(dateinputdelay(), unit = "month") - 1) {
updateDateInput(
session,
inputId = "date",
value = ceiling_date(x = input$date, unit = "month") - 1
)
}
}
})
}