gpt4 book ai didi

r - 基于正则表达式以 Shiny 的方式突出显示 DT 中的单词

转载 作者:行者123 更新时间:2023-12-04 15:38:47 26 4
gpt4 key购买 nike

在 Shiny 中使用 DT,我希望能够突出显示所选单词。设置 searchHighlight = TRUE接近我想要的,但这也会突出显示包含搜索的单词。例如,如果我搜索“on”,它也会匹配“stone”,突出显示中间的“on”。

示例图像:

Words within words being highlighted

我可以优化搜索选项 regex = TRUE ,但随后不会发生突出显示。例如,如果我想使用像“on|in”这样的正则表达式也是如此。

示例(包括正则表达式):

library(shiny)
library(DT)
library(data.table)

example_data <- data.table(words = c("on", "scone", "wrong", "stone"),
description = c("The word on", "Scone is not on.", "Not on either", "Not here at all"))

ui = shinyUI(fluidPage(

sidebarLayout(
sidebarPanel(
textInput("word_select", label = "Word to search")
),
mainPanel(
dataTableOutput("word_searched")
)
)
))

server = shinyServer(function(input, output, session) {

output$word_searched <- renderDataTable({
datatable(
example_data,
options = list(searchHighlight = TRUE,
search = list(regex = TRUE,
search = paste0("\\b", tolower(input$word_select), "\\b")))
)
})

})

shinyApp(ui = ui, server = server)

DT 已经通过 react 表达式过滤了单词,因此所有字段肯定会包含所选单词,但我只是想避免用户认为更长的单词被错误地包含在搜索中而产生混淆。我在示例中没有这样做,但只是确认这不是我关心的元素。

谢谢你的帮助。

(编辑以在示例数据中添加一个带有标点符号的单词示例。)

最佳答案

您可以创建一个 reactive,而不是依赖数据表的搜索功能。首先按输入过滤的元素,然后用嵌入在 <span style="background-color:yellow;"> 中的相同单词替换匹配的单词标签。这应该允许通过更复杂的正则表达式获得更大的搜索灵活性。

您需要添加 escape = Fdatatable所以 HTML 标签被正确解释。我已添加 options = list(dom = "lt")datatable删除数据表的搜索字段并直接关注左侧搜索字段。

过滤条件相当模糊,以防止表格消失,直到找到完美匹配——即,当您键入“o”时,表格不应该消失,因为没有完美匹配,然后在“on”时重新出现。只有在找到匹配的单词时才会出现突出显示,即 on , On , 和 on. ,但不是 stone , scone等。下面是它的外观一瞥:

enter image description here

这是代码。请注意,我使用了 dplyr 的过滤和变异函数,因为它们可以通过它们的 *_all 轻松应用于多个列。变体:

library(shiny)
library(DT)
library(data.table)
library(dplyr) # For `filter_all` and `mutate_all`.

example_data <- iris
# data.table(words = c("on", "scone", "wrong", "stone"),
# description = c("The word on", "Scone is not on.", "Not on either", "Not here at all"))

ui = shinyUI(fluidPage(

sidebarLayout(
sidebarPanel(
textInput("word_select", label = "Word to search")
),
mainPanel(
dataTableOutput("word_searched")
)
)
))

server = shinyServer(function(input, output, session) {

# This is your reactive element.
df_reactive <- reactive({
example_data %>%
# Filter if input is anywhere, even in other words.
filter_all(any_vars(grepl(input$word_select, ., T, T))) %>%
# Replace complete words with same in HTML.
mutate_all(~ gsub(
paste(c("\\b(", input$word_select, ")\\b"), collapse = ""),
"<span style='background-color:yellow;'>\\1</span>",
.,
TRUE,
TRUE
)
)
})

# Render your reactive element here.
output$word_searched <- renderDataTable({
datatable(df_reactive(), escape = F, options = list(dom = "lt"))
})

})

shinyApp(ui = ui, server = server)

关于r - 基于正则表达式以 Shiny 的方式突出显示 DT 中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56633621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com