【问题标题】:Searching Columns in R shiny Datatable that has Multiple Entries在具有多个条目的 R 闪亮数据表中搜索列
【发布时间】:2017-07-12 21:25:33
【问题描述】:

我在 R Shiny 中有一个数据表,其中一列“关键字”包含某些行的多个条目,用逗号分隔。我希望这些多个条目可以单独搜索。数据表的默认搜索功能将这些条目视为一个长的单个项目。

例如,第 2 行的关键字列值为“Keyword1,Keyword2”。我希望用户能够搜索“Keyword1”或“Keyword2”并找到第2行。目前,数据表中的默认搜索栏将此条目视为一项:“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)

【问题讨论】:

  • 也许您可以实现正则表达式搜索?将搜索词作为正则表达式(可能是固定的)传递并尝试在Keywords 中的任何位置找到匹配词。
  • 你能做一个最小的可重现的例子吗,当我使用数据表时,它会给出你默认需要的行为。

标签: r filter datatable shiny dt


【解决方案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

由于我没有要重现的代码,我只是想出了这个示例,您可以使用用户输入将其扩展到闪亮的数据表。

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

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 内置的搜索功能集成?
  • 再次阅读您的主要问题后,我意识到您希望 DT::datatable 中的搜索功能查找特定字符串。当我使用右上角的Search 选项而不是filter 时,我可以只输入keyword1,它会过滤掉包含keyword1 的行,同样地,搜索中的keyword2 将导致包含keyword2 的行。问题是当您使用 filter 选项时。
  • filter 选项更像是在 Excel 中,您只能根据每行中的值进行筛选。但是Search 选项会在所有列中查找字符串。
  • 刚刚更新了解决方案。问题是您要搜索的列是一个过滤器。将其转换为字符,它将正常工作。
  • 将其转换为字符的唯一问题是现在用户必须事先知道并输入搜索词。他们不再像在列是一个因素时那样看到可用选项的列表。除此之外,这种方法效果很好
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多