R Shiny pickerInput搜索框粘贴值匹配及不匹配提示实现方法
实现方案
完全可以在保留pickerInput原有全部功能的前提下实现该需求,核心思路是通过JS监听搜索框的粘贴事件,对粘贴内容做分割处理后匹配可选值,同时统计不匹配项输出提示。
完整可运行代码
library("shiny") library(shinyWidgets) ui <- fluidPage( # 监听pickerInput搜索框粘贴事件的JS脚本 tags$script(HTML(" $(document).on('paste', '.bs-searchbox input', function(e) { // 获取粘贴的文本 let pasteText = e.originalEvent.clipboardData.getData('text'); // 按换行、逗号、空格分割为单个选项,过滤空值 let pasteItems = pasteText.split(/[\\n,\\s]+/).filter(item => item.trim() !== ''); // 将分割后的选项传递给Shiny后端处理 Shiny.setInputValue('pasted_items', pasteItems, {priority: 'event'}); // 清空搜索框 $(this).val(''); // 阻止默认粘贴行为 e.preventDefault(); }); ")), pickerInput( inputId = "somevalue", label = "A label", choices = c("apple", "orange", "mango", "pear"), options = list( `actions-box` = TRUE, `live-search` = TRUE, `selected-text-format`= "count", `count-selected-text` = "{0} choosen (on a total of {1})" ), multiple = T ), # 匹配提示信息 uiOutput("match_tip", style = "color: #dc3545; margin: 10px 0;"), verbatimTextOutput("value") ) server <- function(input, output, session) { # 所有可选值的向量 all_choices <- c("apple", "orange", "mango", "pear") # 监听粘贴事件触发的输入 observeEvent(input$pasted_items, { # 匹配成功的项 matched_items <- intersect(input$pasted_items, all_choices) # 不匹配的项 unmatched_items <- setdiff(input$pasted_items, all_choices) # 更新pickerInput的选中值,保留之前已经选中的项 updatePickerInput(session, "somevalue", selected = unique(c(input$somevalue, matched_items))) # 生成提示信息 if(length(unmatched_items) > 0) { output$match_tip <- renderUI({ paste0("以下内容未匹配到可选值:", paste(unmatched_items, collapse = "、")) }) } else { output$match_tip <- renderUI({NULL}) } }) output$value <- renderPrint(input$somevalue) } shinyApp(ui, server)
功能说明
- 支持粘贴多个用换行、逗号、空格分隔的选项,自动匹配选中存在的可选值
- 自动保留之前已经选中的选项,不会覆盖原有选择
- 存在不匹配项时会在pickerInput下方显示红色提示,无匹配问题则不显示提示
- 完全保留pickerInput原有的全选、反选、搜索、计数等全部特性
内容的提问来源于stack exchange,提问作者user324810
相关产品推荐
相关产品推荐

