在R Shiny Datatable中搜索具有多个条目的列

3
我在R Shiny中有一个datatable,其中一列Keywords对于某些行包含多个条目,以逗号分隔。我希望这些多个条目可以单独搜索。Datatable的默认搜索功能将这些条目视为一个长字符串。
例如,第2行关键字列的值为"Keyword1, Keyword2"。我希望用户能够搜索"Keyword1"或"Keyword2"并找到第2行。目前,datatable中的默认搜索栏将此条目视为一个项目:"Keyword1, Keyword2",只允许人们搜索"Keyword1, Keyword2"作为一个联合项目,而不是两个独立的值。
以下是一个小的、可重现的问题示例:
library(shiny)
library(DT)

## Create an example dataset with 3 rows and 1 column
dat <- matrix(c("Keyword1", "Keyword1, Keyword2", "Keyword2"), nrow = 3, ncol = 1)
colnames(dat) <- "Keywords"
dat <- data.frame(dat)

ui <- shinyUI(
  DT::dataTableOutput('ex1')
)

server <- shinyServer(function(input, output) {
  output$ex1 <- DT::renderDataTable(
     DT::datatable(dat, filter = "top")
  )
})

shinyApp(ui = ui, server = server)

1
也许你可以实现一个正则表达式搜索?将搜索词作为正则表达式(也许是固定的)传递,并尝试在“Keywords”中任何位置找到匹配项。 - Roman Luštrik
你能否提供一个最小可重现的示例?当我使用datatable时,默认情况下会给出您所需的行为。 - NicE
1个回答

1
也许您可以尝试像这样做:

keys <- c("Keyword1", "Keyword1, Keyword2", "Keyword2")
grepl(paste("Keyword1", collapse = "|"), keys)
#output
[1]  TRUE  TRUE FALSE

grepl(paste("Keyword2", collapse = "|"), keys)
#output
[1]  FALSE  TRUE  TRUE

由于我没有任何可复现的代码,所以我只想出了这个例子,您可以使用用户输入将其扩展到闪亮的datatable中。

在您的情况下,您可以做以下操作:

filter <- grepl(paste(input$keys, collapse = "|"), data$keywords)

我假设keys是用户输入框的IDkeywords是数据表格data中的列。然后,您可以使用filter相应地对数据进行子集筛选。
编辑: 问题在于,至少对于示例数据集并假设您的情况相同,具有筛选器的列是Factor。如果您使用as.character()将该列转换为Character,则代码将正常工作。当您在筛选器中搜索keyword1时,它将仅显示包含keyword1的行。
library(shiny)
library(DT)

## Create an example dataset with 3 rows and 1 column
dat <- matrix(c("Keyword1", "Keyword1, Keyword2", "Keyword2"), nrow = 3, ncol = 1)
colnames(dat) <- "Keywords"
dat <- data.frame(dat)
dat$Keywords <- as.character(dat$Keywords)

ui <- shinyUI(
  DT::dataTableOutput('ex1')
)

server <- shinyServer(function(input, output) {
  output$ex1 <- DT::renderDataTable(
    DT::datatable(dat, filter = "top")
  )
})

shinyApp(ui = ui, server = server)

你如何将此与DT::datatable内置的搜索功能集成? - user7606328
再次阅读您的主要问题后,我意识到您希望DT::datatable中的搜索功能查找特定字符串。当我在右上角使用“搜索”选项而不是“筛选器”时,我只需键入关键字1,它就会过滤掉包含关键字1的行,同样,搜索中的关键字2将导致包含关键字2的行。问题是当您使用“筛选器”选项时。 - krish
filter 选项更像是 Excel 中,您只能根据每行中的值进行筛选。但是 Search 选项会查找所有列中的字符串。 - krish
刚刚更新了解决方案。问题在于您尝试搜索的列是一个过滤器。将其转换为字符,它就可以正常工作了。 - krish
将其转换为字符的唯一问题是现在用户必须事先知道并输入搜索术语。当列为因子时,他们不再能够看到可用选项列表。除此之外,这种方法运作良好。 - user7606328

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接