You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含emoji的SelectInput实现精确匹配的条件面板?

实现Shiny SelectInput选项的精确匹配条件

要将原来的包含匹配改为精确匹配目标选项,你可以按以下方式修改代码:

  1. 先在R中定义目标选项的完整字符串,避免重复编写且方便后续处理特殊字符
  2. 使用JavaScript的严格相等运算符===进行精确匹配,同时借助jsonlite::toJSON()将R字符串转译为JavaScript可正确识别的格式(自动处理非断空格、emoji这类特殊字符)

修改后的完整代码

library(shiny)
library(shinyWidgets)
library(stringi)
library(emo)
library(jsonlite) # 多数情况下已随shiny安装,若未安装需执行install.packages("jsonlite")

# 定义目标选项的完整内容
default_choice <- paste("No selection", stri_dup(intToUtf8(160), 3), emo::ji("sun"))

ui <- fluidPage(
  mainPanel(
    div(
      selectInput(
        inputId = "MySelection",
        label = "Which choice ? :",
        choices = c(
          default_choice,
          "Selection one",
          "Selection two"
        ),
        width = '350px'
      )
    ),
    width = 3 
  ),
  
  conditionalPanel(
    # 生成精确匹配的JS条件:用===判断严格相等,toJSON确保字符串格式符合JS要求
    condition = sprintf("input.MySelection === %s", jsonlite::toJSON(default_choice)),
    "Test number 1"
  )
)

server <- function(input, output){
  output$ChoosenSection <- renderText({
    input$MySelection
  })
}

shinyApp(ui = ui, server = server)

核心要点

  • 原来的indexOf('No selection') > -1是包含匹配,只要选项文本里有"No selection"就会触发;改用===后是精确匹配,只有当选中的选项和default_choice完全一致时才会显示面板
  • jsonlite::toJSON()会自动处理字符串中的特殊字符(比如非断空格、emoji),生成符合JavaScript语法的字符串字面量,避免因字符编码问题导致匹配失败

内容的提问来源于stack exchange,提问作者R_User_001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:15:09