2016-03-17 4 views
1

В настоящее время я пытаюсь создать R-блестящее приложение, в котором пользователь может выполнять поиск по нескольким столбцам в каждой строке. Эта функция работает с использованием функции datatable из пакета DT за пределами блестящей среды. Используя пример набора данных iris, я хочу найти все строки, содержащие значения; 5.1, 3.5 и 1.4. Если я наберу следующую строку в окне поиска диалогового окна данных «5.1 3.5 1.4», будут показаны строки 1 и 18.Поиск нескольких столбцов Datatable в Shiny

library(DT) 
head(iris) 

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
# 4   4.6   3.1   1.5   0.2 setosa 


datatable(iris) 

Проблема заключается в том, когда я пытаюсь сделать то же самое в блестящей среде я получать сообщение

Нет соответствия найденных записей.

Например:

if (interactive()) { 
    library(shiny) 
    shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))), 
    server = function(input, output) { 
     output$tbl = DT::renderDataTable(
     iris, options = list(lengthChange = FALSE) 
    ) 
    } 
) 
} 

Кто-нибудь есть работа вокруг, или может сказать мне, что я делаю неправильно?

+0

Если вы установите 'сервер = false' внутри' renderDataTable', это работает. По-видимому, у Shiny есть проблема с пробелами, почему-то; вероятно, ошибка. – alistaire

+0

Эй, Алистер, да, я только что нашел это. Благодарю. –

+0

@alistaire 'server = TRUE' сложно. Я отправил ответ. –

ответ

2

Для кого-либо еще с той же проблемой вам необходимо указать server=FALSE функции renderDataTable.

if (interactive()) { 
    library(shiny) 
    shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))), 
    server = function(input, output) { 
     output$tbl = DT::renderDataTable(
     iris, options = list(lengthChange = FALSE), server = FALSE 
    ) 
    } 
) 
} 
+1

Что делать, если требуется использовать серверную обработку и использовать 'server = TRUE'? – keshr3106

+0

@ keshr3106 Решение не очень просто. Я только что написал ответ. –

1

Update: Я реализовал smart filtering в режиме обработки на стороне сервера и она включена по умолчанию. С DT> = 0.2.29, он должен работать из коробки:

devtools::install_github('rstudio/DT') 
library(shiny) 
shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))), 
    server = function(input, output) { 
    output$tbl = DT::renderDataTable(
     iris, options = list(search = list(search = '5.1 3.5 1.4')) 
    ) 
    } 
) 

smart filtering in DT in the server mode


Вы можете игнорировать старый ответ ниже.

Вы можете включить регулярные выражения в поиске (see more examples in the DT documentation).

library(shiny) 
shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))), 
    server = function(input, output) { 
    output$tbl = DT::renderDataTable(
     iris, options = list(search = list(regex = TRUE)) 
    ) 
    } 
) 

В приведенном выше примере, я использовал регулярное выражение 5.1|3.5|1.4. Обратите внимание, что это означает «найти значения 5.1, 3.5, или 1.4 в любые столбцы». Если вам нужно найти 5.1 в первом столбце, 3.5 во втором столбце и 1.4 в третьем столбце, нет способа сделать это в режиме обработки на стороне сервера с помощью одной строки поиска (одно регулярное выражение не может выразить это). Вы должны использовать либо обработку на стороне клиента (то есть, server = FALSE, как вы обнаружили), или отсортировать столбцы, чтобы найти комбинацию вам необходимо:

regex in DT

или использовать фильтры столбцов для фильтрации отдельных столбцов:

library(shiny) 
shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))), 
    server = function(input, output) { 
    output$tbl = DT::renderDataTable(
     iris, filter = 'top' 
    ) 
    } 
) 

column filters in DT

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