Shiny pickerInput:如何通过单击一个选项来选择多个选项(并保持下拉列表打开)

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

我想这样做,当我在下拉列表中选择

"All_UPPER"
时,它会自动选择该组中的所有项目。

我可以使用它

shinyWidgets::updatePickerInput()

示例:

library(shiny)
library(shinyWidgets)

choices <- c("All_UPPER", "a", "b", "c", "A", "B", "C")

ui <- fluidPage(
  pickerInput("group_select", choices = choices, multiple = TRUE),
  textOutput("testOutput")
)

server <- function(input, output, session) {

  all_upper <- c("A", "B", "C")

  output$testOutput <- renderText({paste(input$test)})

  observeEvent(input$group_select, {
    req(input$group_select)
    if ("All_UPPER" %in% input$group_select) {
      updatePickerInput(session, "group_select", selected =  c(input$group_select, all_upper))
    }

  })

}

shinyApp(ui = ui, server = server)

所需的输出是一个打开的下拉菜单,其中选择了相关项目:

我遇到的问题是,当

updatePickerInput()
运行时,下拉列表会关闭。我希望它保持打开状态,以便用户可以根据需要选择更多项目。

如何防止下拉菜单关闭? (或者如何自动再次打开?)

r shiny dropdown pickerinput
1个回答
0
投票

我有一个黑客解决方法给你:

  1. 添加模拟点击的JS函数。
  2. 调用此函数后调用
    updatePickerInput
  3. 由于观察者总是触发两次(一次当您将下拉菜单更改为
    All_UPPER
    时,一次在通过
    updatePickerInput
    更新元素后),您需要添加一个标志以避免触发两次点击。

NB. 我尝试通过调用

.dropdown("toggle")
来使用底层引导 API,但这(无论出于何种原因)只会打开一个空列表。

library(shiny)
library(shinyWidgets)

choices <- c("All_UPPER", "a", "b", "c", "A", "B", "C")

js <- HTML("
 Shiny.addCustomMessageHandler('toggle_dropdown', function(message) {
   // Just opens an empty list - no idea why
   // $('#' + message.id).parent().find('.dropdown-toggle').dropdown('toggle');
   $('#' + message.id).parent().find('.dropdown-toggle').trigger('click');
 })  
")

ui <- fluidPage(
   tags$head(tags$script(js)),
   pickerInput("group_select", choices = choices, multiple = TRUE),
   textOutput("testOutput")
)

server <- function(input, output, session) {
   changed <- reactiveVal(TRUE)
   
   all_upper <- c("A", "B", "C")
   
   output$testOutput <- renderText({paste(input$test)})
   
   observeEvent(input$group_select, {
      req(input$group_select)
      if ("All_UPPER" %in% input$group_select && changed()) {
         updatePickerInput(session, "group_select", 
                           selected =  c(input$group_select, all_upper))
         session$onFlushed(function() 
            session$sendCustomMessage("toggle_dropdown", list(id = "group_select"))
         )
         changed(FALSE)
      } else {
         changed(TRUE)
      }
      
   })
   
}

shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.