R 在基于正则表达式的文本中突出显示DT中的单词
在shinny中使用DT,我希望能够突出显示所选单词。设置R 在基于正则表达式的文本中突出显示DT中的单词,r,shiny,dt,R,Shiny,Dt,在shinny中使用DT,我希望能够突出显示所选单词。设置searchHighlight=TRUE与我想要的接近,但这也会突出显示包含搜索的单词。例如,如果我正在搜索“on”,它也将匹配“石头”,强调中间的“on”。p> 示例图像: 我可以优化搜索选项,使其regex=TRUE,但不会突出显示。例如,如果我想使用类似“on | in”的正则表达式,这也是正确的 示例(包括正则表达式): 库(闪亮) 图书馆(DT) 库(数据表) 示例_data我不确定这是否是您想要的,但我认为这很接近:这不会执
searchHighlight=TRUE
与我想要的接近,但这也会突出显示包含搜索的单词。例如,如果我正在搜索“on”,它也将匹配“石头”,强调中间的“on”。p>
示例图像:
我可以优化搜索选项,使其regex=TRUE
,但不会突出显示。例如,如果我想使用类似“on | in”的正则表达式,这也是正确的
示例(包括正则表达式):
库(闪亮)
图书馆(DT)
库(数据表)
示例_data我不确定这是否是您想要的,但我认为这很接近:这不会执行精确搜索(例如“on”将匹配“stone”),但这只会突出显示精确匹配(例如,“on”将不会突出显示)。这将使用mark.js
库
dtable <- datatable(iris[c(1,2,51,52,101,102),],
options = list(
mark = list(accuracy = "exactly")
)
)
dep1 <- htmltools::htmlDependency(
"datatables.mark", "2.0.1",
src = c(href = "https://cdn.datatables.net/plug-ins/1.10.19/features/mark.js"),
script = "datatables.mark.min.js")
dep2 <- htmltools::htmlDependency(
"jquery.mark", "8.11.1",
src = c(href = "https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1"),
script = "jquery.mark.min.js")
dtable$dependencies <- c(dtable$dependencies, list(dep1, dep2))
dtable
dtable您可以创建一个reactive
元素,该元素首先根据输入进行过滤,然后用嵌入
标记中的相同单词替换匹配单词,而不必依赖datatable的搜索功能。这将允许通过更复杂的正则表达式实现更大的搜索灵活性
您需要将escape=F
添加到datatable
中,以便正确解释HTML标记。我已将options=list(dom=“lt”)
添加到datatable
中,以删除datatable的搜索字段,并将注意力引向左侧的搜索字段
过滤条件保持相当模糊,以防止表消失,直到找到完美匹配-即,当您键入“o”时,表不应消失,因为没有完美匹配,然后在“on”处重新出现。只有在找到匹配的单词时,才会显示突出显示,即
上的、
上的和
上的,而不是石头
、烤饼
,等等。下面是它的大致外观:
这是代码。请注意,我使用了dplyr的过滤和变异函数,因为它们可以通过*\u all
变体轻松应用于多个列:
库(闪亮)
图书馆(DT)
库(数据表)
库(dplyr)#用于'filter\u all'和'mutate\u all'。
示例_数据%
#在HTML中将完整的单词替换为相同的单词。
突变所有(~gsub(
粘贴(c(“\\b”(“,输入$word\u选择“)\\b”),折叠=”),
"\\1",
.,
是的,
真的
)
)
})
#在这里呈现你的反应元素。
输出$word\u搜索谢谢!这看起来很有希望。我已经在闪亮的应用程序中检查过了,它几乎可以工作了。我注意到的一件事是,它不会突出带有标点符号的单词——例如,如果单词类似于“(on)”,或者在类似于“on”的句子末尾。你知道如何处理这个问题吗?另外(不太重要的是)有没有改变高光颜色的方法?我的屏幕是一个非常淡的黄色,不够亮,不能真正突出。@Megan去看医生。你可以用CSS控制颜色。我不知道标点符号。谢谢,这基本上有效!它不一定适用于regex元素,但我认为我可以用这种方法解决这个问题。注意:我使用下面的代码为反应式使用data.table(不过滤,因为我不需要它,但可以使用类似的方法):example_data_dt[,lapply(.SD,function(x)gsub(paste0(\\b(“,input$word_select,”)\\b”),“\\1”,x,TRUE,TRUE))]
我真的很感激这篇文章从一个不同的角度来看待这个问题,以及我是如何尝试去做的(从DT内部):@Megan很高兴听到它的工作!这种策略还有一个优点,那就是对您可以做什么的限制更少。例如,使用if-else条件,您可以使用一种颜色进行部分匹配,另一种颜色用于完全匹配,等等。我可能弄错了,但datatable内置的搜索高亮显示功能看起来不是很通用。
dtable <- datatable(iris[c(1,2,51,52,101,102),],
options = list(
mark = list(accuracy = "exactly")
)
)
dep1 <- htmltools::htmlDependency(
"datatables.mark", "2.0.1",
src = c(href = "https://cdn.datatables.net/plug-ins/1.10.19/features/mark.js"),
script = "datatables.mark.min.js")
dep2 <- htmltools::htmlDependency(
"jquery.mark", "8.11.1",
src = c(href = "https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1"),
script = "jquery.mark.min.js")
dtable$dependencies <- c(dtable$dependencies, list(dep1, dep2))
dtable