首页 文章

更改checkboxGroupInput标签的字体标记(即粗体,斜体)

提问于
浏览
-1

我正在用R中的Shiny创建一个Web应用程序 . 我有一个数据集,我在 Map 上绘制 . 使用checkboxGroupInput小部件,用户可以选择他们想要在 Map 上看到的类别(或不) . 但是,数据集随时间而变化,并非所有类别始终可用 . 为了清楚当前集合中哪些可用,哪些不可用,我想将可用类别格式化为粗体 .

到目前为止,我无法通过复选框显示带有粗体标签的 checkboxGroupInput 小部件 . 有没有办法做到这一点?我想要一些标签是大胆的而其他标签不是 . 此外,使用 updateCheckboxGroupInput 我可以更改选项(即仅显示可用的类别),但这不是我想要/需要的 .

我试过例如:

x <- list("<b>A</b>"=1, "<b>B</b>"=2, "C"=3)

checkboxGroupInput(inputId="test", label="this is a test", choices=x)

但是这种方法仅在用户界面中将格式化标签显示为文本 . 使用Shiny的 HTML() 函数的解决方案并没有错误地使用.1603726_ m .

有任何想法吗?

这是一个简单的Shiny接口示例,使用上述方法(不起作用):

library("shiny")

x <- list("<b>A</b>"=1, "<b>B</b>"=2, "C"=3)

server = function(input, output) {}

ui = fluidPage(
    checkboxGroupInput(inputId="test", label="this is a test", choices=x)
)

runApp(list(ui = ui, server = server))

下一个示例可以工作,但它是初始化复选框组时的解决方案 . 在服务器部件中启用 observe 功能表明相同的解决方案不适用于 updateCheckboxGroupInput . 这是有道理的,因为该函数不返回HTML代码 . 我不知道如何访问该更新函数的输出,或者如何解决它 .

library("shiny")

x <- list("<b>A</b>"=1, "<b>B</b>"=2, "C"=3)
y <- list("<b>D</b>"=1, "<b>E</b>"=2, "F"=3)

server = function(input, output, session) {
    # observe({
        # input$test
        # gsub("&gt;", ">", gsub("&lt;", "<", updateCheckboxGroupInput(session, "test", choices=y)))
    # })
}

ui = fluidPage(
    gsub("&gt;", ">", gsub("&lt;", "<", checkboxGroupInput(inputId="test", label="this is a test", choices=x)))
)

runApp(list(ui = ui, server = server))

1 回答

  • 0

    现在我找到了解决方案 . 不是很优雅,可能容易出错,但它确实有效 . 我发现<和>字符由 htmltools 函数 escapeHtml 转义为HTML目的 . 通过在调用 updateCheckboxGroupInput 之前临时替换该函数,通过虚函数,文本不会被转义 . 调用 updateCheckboxGroupInput 后,当然需要恢复 htmlEscape .

    一个有效的例子 . 启动应用程序后,您需要检查第一个框以查看它是否有效:

    library("shiny")
    
    x <- list("<b>A</b>"=1, "<b>B</b>"=2, "C"=3)
    y <- list("<b>D</b>"=1, "<b>E</b>"=2, "F"=3)
    
    server = function(input, output, session) {
        observe({
            value <- input$test
    
            if (length(value) > 0 && value == 1) {
                ## save htmlEscape function and replace htmlEscape
                saved.htmlEscape <- htmltools::htmlEscape
                assignInNamespace("htmlEscape", function(x, attribute) return(x), "htmltools")
    
                updateCheckboxGroupInput(session, "test", label="OK", choices=y)
    
                ## restore htmlEscape function
                assignInNamespace("htmlEscape", saved.htmlEscape, "htmltools")
            }
        })
    }
    
    ui = fluidPage(
        checkboxGroupInput(inputId="test", label="this is a test", choices=x)
    )
    
    runApp(list(ui = ui, server = server))
    

相关问题