在查找十六进制代码的情况下,如何有条件地格式化 Shiny 中的文本?

How do I conditionally format text in Shiny given a lookup of hex codes?

我真的很难过。希望有人知道如何解决这个问题。

这是我的问题的简化版本。假设我在 R 中有这样一个句子:

"The quick brown fox jumped over the lazy dog."

假设我希望单词 "brown" 和单词 "over" 分别以蓝色和绿色突出显示。其他一切都应该没有亮点。

在 R 中,我为每个单词分配了一个十六进制代码。在我上面的示例中,数据框将如下所示:

df <- as.data.frame(c("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."))
df$color <- c("#ffffff","#ffffff", "#a7eef9", "#ffffff", "#ffffff", "#bcdd87", "#ffffff", "#ffffff", "#ffffff")
colnames(df) <- c("word", "color")

现在,进入 Shiny App。我可以使用以下方法将整个字符串的背景颜色设置为一个十六进制代码:

tags$head(tags$style(HTML("#thetextoutput{background-color: #a7eef9}")))))

但我如何逐字整合十六进制代码?我发现这非常难以实现。任何见解将不胜感激。

具有单一高亮显示的完全可重现代码:

library(shiny)
library(shinyjs)
library(tidyverse)
library(htmltools)
library(tools)

df <- as.data.frame(c("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."))
df$color <- c("#ffffff","#ffffff", "#a7eef9", "#ffffff", "#ffffff", "#bcdd87", "#ffffff", "#ffffff", "#ffffff")
colnames(df) <- c("word", "color")
example.text <- "The quick brown fox jumped over the lazy dog."

ui <- mainPanel(
  fluidRow(
    useShinyjs(),
    h3("Hello world"),
    uiOutput("thetextoutput"),
    tags$head(tags$style(HTML("#thetextoutput{background-color: #a7eef9}")))))


server <- function(input, output){

output$thetextoutput <- 
  renderUI({
    return(example.text)
    })
}

shinyApp(ui, server)

非常感谢。

不太清楚你是如何设置变量的,所以我冒昧地稍微改变了一下。

我所做的是在 renderUI 内部,我将字符串拆分为单词(例如,您需要使用更聪明的正则表达式,因为此正则表达式不会删除标点符号),然后只比较每个单词添加到 table,并创建一个单独的 <span> 标签,每个词都有一种颜色。

library(shiny)

word_colour_map <- setNames(
  c("#aaaaaa","#aaaaaa", "#a7eef9", "#aaaaaa", "#aaaaaa", "#bcdd87", "#aaaaaa", "#aaaaaa", "#aaaaaa"),
  c("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog")
)
example.text <- "The quick brown fox jumped over the foo lazy dog bar"
default_colour <- "#000000"

ui <- mainPanel(
  fluidRow(
    uiOutput("thetextoutput")
  )
)


server <- function(input, output){

  output$thetextoutput <- 
    renderUI({
      words <- strsplit(example.text, " ")[[1]]
      lapply(words, function(word) {
        col <- default_colour
        if (word %in% names(word_colour_map)) {
          col <- word_colour_map[[word]]
        }
        tags$span(style = paste("color:", col), word)
      })
    })
}

shinyApp(ui, server)