我有一个包含两个日期预设和一个“自定义”预设的下拉菜单。
“自定义”预设应使用户能够使用日期选择器输入来选择自定义日期范围。如果选择任何其他预设,则应禁用日期选择器输入。
我首先按照
here的建议使用
shinyjs::disabled()
禁用该元素。然后我运行 shinyjs::disable()
或 shinyjs::enable()
,具体取决于在下拉列表中选择的预设。
如果我在按钮上使用
disable/enable
,这将按预期工作,但由于某种原因,这对于闪亮的小部件不起作用。当我选择“自定义”时,即使触发了 shinyjs::enable()
,它仍然处于禁用状态。
我错过了什么?
示例:
library(shiny)
library(shinyWidgets)
library(shinyjs)
ui <- fluidPage(
shinyjs::useShinyjs(),
## pick a date preset
shinyWidgets::pickerInput(
inputId = "date_preset",
choices = c("Preset 1", "Preset 2", "Custom"),
selected = "Preset 1"
),
## custom date picker widget
uiOutput("ui_date_calendar"),
## test button
uiOutput("ui_testbutton"),
)
server <- function(input, output, session) {
# get date ranges for presets
date_range <- reactive({
shinyjs::disable("ui_date_calendar") # working
shinyjs::disable("ui_testbutton") # working
if (input$date_preset == "Custom"){
shinyjs::enable("ui_date_calendar") #NOT working
shinyjs::enable("ui_testbutton") #working
return(NULL)
}
if (input$date_preset == "Preset 1"){
return(c("2024-01-01", "2024-02-01"))
}
if (input$date_preset == "Preset 2"){
return(c("2024-02-01", "2024-03-01"))
}
})
# generate date picker UI
output$ui_date_calendar <- renderUI(
shinyjs::disabled(shinyWidgets::airDatepickerInput(
inputId = "date_picker",
value = date_range(),
range = TRUE,
placeholder = "Click to pick a date range"
))
)
# generate button UI
output$ui_testbutton <- renderUI(
shinyjs::disabled(actionButton("testbutton", "TEST"))
)
}
shinyApp(ui = ui, server = server)
也许您可以使用
updateAirDateInput
更新日期范围,然后启用它。试试这个
server <- function(input, output, session) {
observeEvent(input$date_preset, {
if (input$date_preset == "Custom"){
shinyjs::enable("ui_date_calendar") # working
shinyjs::enable("ui_testbutton") #working
updateAirDateInput(session,"date_picker",value=date_range())
} else {
updateAirDateInput(session,"date_picker",value=date_range())
shinyjs::disable("ui_date_calendar") # working
shinyjs::disable("ui_testbutton") # working
}
})
# get date ranges for presets
date_range <- reactive({
req(input$date_preset)
if (input$date_preset == "Custom"){
return(NULL)
} else if (input$date_preset == "Preset 1"){
return(c("2024-01-01", "2024-02-01"))
} else if (input$date_preset == "Preset 2"){
return(c("2024-02-01", "2024-03-01"))
} else {
return(NULL)
}
})
# generate date picker UI
output$ui_date_calendar <- renderUI({
shinyjs::disabled(
shinyWidgets::airDatepickerInput(
inputId = "date_picker",
value = c("2024-01-01", "2024-02-01"),
range = TRUE,
placeholder = "Click to pick a date range"
)
)
})
# generate button UI
output$ui_testbutton <- renderUI(
shinyjs::disabled(actionButton("testbutton", "TEST"))
)
}