R Shiny中crosstalk filter_select的&符号转义异常解决咨询
解决crosstalk filter_select中转义&的问题
问题根源是crosstalk的filter_select会自动对选项文本做HTML转义,导致&被转换成&。以下是两种可行的解决方法:
方案一:自定义selectize渲染函数
修改filter_select的options参数,指定选项渲染时不转义文本,直接显示原始内容:
library(reactable) library(tidyverse) library(crosstalk) library(shiny) library(htmlwidgets) df <- tibble(points = c(10, 12, 14), stadium = c("M&T Bank Stadium", "Wembley Stadium", "FirstBank Stadium")) df_crosstalk <- SharedData$new(df) df_react <- reactable(df_crosstalk) ui <- fluidPage( titlePanel("Test Ampersand"), fluidRow( column( 4, filter_select( id = "stadium", label = "Stadium", sharedData = df_crosstalk, group = ~stadium, # 自定义渲染逻辑,关闭HTML转义 options = list( render = list( option = JS("function(item, escape) { return item.label; }") ) ) ) ), column( 8, df_react ) ) ) server <- function(input, output, session) { output$table <- renderReactable({ df_react }) } shinyApp(ui, server)
默认的selectize渲染函数会用escape(item.label)转义HTML字符,这里直接返回item.label,让浏览器自动解析&为&。
方案二:将数据列标记为HTML内容
在创建数据框时,用htmltools::HTML()将体育场名称标记为HTML内容,告诉crosstalk无需转义:
library(reactable) library(tidyverse) library(crosstalk) library(shiny) library(htmltools) df <- tibble(points = c(10, 12, 14), stadium = map(c("M&T Bank Stadium", "Wembley Stadium", "FirstBank Stadium"), HTML)) df_crosstalk <- SharedData$new(df) df_react <- reactable(df_crosstalk) ui <- fluidPage( titlePanel("Test Ampersand"), fluidRow( column( 4, filter_select( id = "stadium", label = "Stadium", sharedData = df_crosstalk, group = ~stadium ) ), column( 8, df_react ) ) ) server <- function(input, output, session) { output$table <- renderReactable({ df_react }) } shinyApp(ui, server)
这种方法通过R端标记HTML内容,让crosstalk直接按HTML规则解析显示文本,避免自动转义。
内容的提问来源于stack exchange,提问作者Paul Kearney
相关产品推荐
相关产品推荐

