Вместо того, чтобы полагаться на функциональность поиска в datatable, вы можете создать элемент reactive
, который сначала фильтрует по вводу, а затем заменяет соответствующие слова тем же словом, встроенным в тег <span style="background-color:yellow;">
. Это должно обеспечить большую гибкость поиска благодаря более сложному регулярному выражению.
Вам нужно будет добавить escape = F
к datatable
, чтобы тег HTML интерпретировался правильно. Я добавил options = list(dom = "lt")
к datatable
, чтобы удалить поле поиска в datatable и обратить внимание на левое поле поиска.
Критерии фильтрации оставлены нечеткими, чтобы таблица не исчезла до тех пор, пока не будет найдено идеальное совпадение - то есть таблица не должна исчезнуть, когда вы наберете «o», потому что нет идеального совпадения, а затем снова появитесь в «on». Затем блики появляются, только если найдено подходящее слово, то есть on
, On
и on.
, но не stone
, scone
и т. Д. Вот пример того, как оно выглядит:
А вот и код. Обратите внимание, что я использую функции фильтрации и мутации 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)