我想这样做,当我在下拉列表中选择
"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
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)