Shiny pickerInput:如何通过单击一个选项来选择多个选项(并保持打开状态)

nukf8bse  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(119)

我想让它这样,当我选择"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()运行时,updatePickerInput()关闭。我希望它保持开放,这样用户就可以选择更多的项目,如果他们想在那里。
我如何防止关闭的窗口?(如何自动打开?)

kq4fsx7k

kq4fsx7k1#

我有一个黑客的工作区给你:
1.添加一个JS函数来模拟点击。
1.在调用updatePickerInput之后调用此函数
1.由于观察者总是触发两次(一次是在将参数更改为All_UPPER时,另一次是在通过updatePickerInput更新元素后),因此需要添加一个标志以避免单击被触发两次。

  • 注意:* 我试图通过调用.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)

相关问题