2017-02-22 49 views
1

У меня есть datatable в R Shiny, а один из столбцов, Keywords, содержит несколько записей для некоторых строк, разделенных запятой. Я бы хотел, чтобы эти несколько записей были доступны для поиска по отдельности. Функция поиска по умолчанию для datatable рассматривает эти записи как один, длинный, единственный элемент.Поиск столбцов в R shiny Datatable с несколькими записями

Например, значение строки 2 для столбца Ключевые слова «Ключевое слово1, ключевое слово2». Я хотел бы, чтобы пользователь мог искать «Ключевое слово 1» ИЛИ «Ключевое слово2» и находить строку 2. В настоящее время панель поиска по умолчанию в datatable рассматривает эту запись как один элемент: «Ключевое слово1, ключевое слово2» и позволяет пользователям искать для «Ключевое слово1, Ключевое слово2» как единое целое, а не два отдельных значения.

Вот небольшой, воспроизводимый пример задачи

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

Возможно, вы можете выполнить поиск по регулярному выражению? Пройдите поисковый запрос как регулярное выражение (возможно, как фиксированное) и попробуйте найти подходящий термин в любом месте в «Ключевые слова». –

+0

Можете ли вы сделать минимальный воспроизводимый пример, когда я использую datatable, он дает поведение, которое вам требуется по умолчанию. – NicE

ответ

0

Может быть, вы можете попробовать что-то вроде этого:

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 является ID для ввода пользователя и keywords это столбец в DataTable data. Затем вы можете использовать filter для подмножества ваших данных.

РЕДАКТИРОВАТЬ: Проблема, по крайней мере, с образцом набора данных и при условии, что у вас в этом случае, является то, что столбец с фильтром - Factor. Если вы преобразуете столбец в Character, используя as.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) 
+0

Как бы вы интегрировали это с функцией поиска, встроенной в DT :: datatable? – user7606328

+0

Прочитав ваш основной вопрос снова, я понял, что вы хотите, чтобы функция поиска в DT :: datatable искала определенные строки. Когда я использую опцию «Поиск» в верхнем правом углу, а не «фильтр», я могу просто набрать ключевое слово1, и он будет отфильтровывать строки, содержащие ключевое слово1, аналогично, ключевое слово2 в поиске приведет к строкам, содержащим ключевое слово2. Проблема заключается в том, что вы используете опцию 'filter'. – krish

+0

Опция 'filter' больше похожа на Excel, вы можете фильтровать только на основе значений в каждой строке. Однако параметр «Поиск» ищет строки во всех столбцах. – krish

 Смежные вопросы

  • Нет связанных вопросов^_^