R Shiny:使用shinyjs启用/禁用shinyWidget

问题描述 投票:0回答:1

我有一个包含两个日期预设和一个“自定义”预设的下拉菜单。

“自定义”预设应使用户能够使用日期选择器输入来选择自定义日期范围。如果选择任何其他预设,则应禁用日期选择器输入。

我首先按照

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)


input shiny shinyjs disable shinywidgets
1个回答
0
投票

也许您可以使用

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"))
  )
  
}
© www.soinside.com 2019 - 2024. All rights reserved.