Я хочу создать блестящее приложение, которое позволяет пользователю выбирать несколько столбцов для фильтрации data.table
.
Мои реальные данные имеют ~ 110 столбцов, а столбцы numeric
, character
, factor
, integer
Я хочу иметь предварительно выбранный фильтр на боковой панели, а также иметь кнопку +
, позволяющую пользователю создавать собственные фильтры на основе столбцов. Я не знаю, можно ли это сделать блестящим или нет, я читал о insertUI
и removeUI
, но я не знаю, можно ли это применить к этому случаю. Кроме того, фильтры, созданные пользователем, должны применяться последовательно, т. Е. Если пользователь создает три фильтра, следует применять фильтр 1, затем фильтр 2 и затем фильтр 3.
У меня есть этот небольшой пример приложения, в котором есть начальный фильтр на основе Person
с использованием textAreaInput
(мой последний пользователь хотел бы вставить несколько имен в поле, чтобы отфильтровать таблицу), но я хотел бы добавить еще несколько фильтров, например sliderInput
для votes
или раскрывающееся меню для letters
.
library(shinydashboard)
library(dplyr)
library(shiny)
library(DT)
header <- dashboardHeader(title="Analysis and database")
sidebar <- dashboardSidebar(
sidebarMenu(
# Setting id makes input$tabs give the tabName of currently-selected tab
id = "sidebarmenu",
menuItem("Database", tabName="db"),
menuItem("Search by Name", tabName = "Filt_table"),
textAreaInput("name_", "Name")
)
)
body <- dashboardBody(
tabItems(
tabItem("db","table content",
fluidRow(DT::dataTableOutput('tabla'))),
tabItem("Filt_table","Filtered table content",
fluidRow(DT::dataTableOutput('tablafilt')))
)
)
ui <- dashboardPage(header, sidebar, body)
### SERVER SIDE
server = function(input, output, session) {
my_data <- data.frame(Person=c("Anne", "Pete", "Rose", "Julian", "Tristan", "Hugh"),
Votes=c(10,25,56,89.36,78,1500),
Stuff=c("test|3457678", "exterm|4567sdf", "1001(hom);4.3.4|3456", "xdfrtg", "1234|trsef|456(het)", "hyggas|tertasga"),
letters=replicate(6, paste(sample(LETTERS,6, replace=T), collapse="")))
output$tabla <- DT::renderDataTable({
DT::datatable(my_data)
})
filtered <- reactive({
if(is.null(input$name_))
return()
glist <- isolate(input$name_)
filter(my_data, Person %in% glist)
})
output$tablafilt <- DT::renderDataTable({
if(is.null(input$name_))
return()
DT::datatable(filtered (),
filter = 'top',
extensions = 'Buttons',
options = list(
dom = 'Blftip',
buttons =
list('colvis', list(
extend = 'collection',
buttons = list(list(extend='csv',
filename = 'results'),
list(extend='excel',
filename = 'results'),
list(extend='pdf',
filename= 'results')),
text = 'Download'
)),
scrollX = TRUE,
pageLength = 5,
lengthMenu = list(c(5, 15, -1), list('5', '15', 'All'))
), rownames = FALSE
)
})
}
shinyApp(ui, server)
selectizeInput
, мои реальные данные содержат 20 000 строк иselectizeInput
отображают все параметры. Если это слишком много вопросов, последовательного фильтра будет достаточно. Спасибо 10.01.2019selectizeInput
спецификации. Вы бы заменилиselectInput("createFilter", "Create Filter", names(my_data))
(вверху моего сообщения) вводом текста или как бы вы подошли к задаче 20k строк? 18.01.2019selectInput
может быть подмножеством столбцов, хотя в наборе данных более 100 столбцов, которые пользователь обычно хочет отфильтровать максимум по 5-10 20.01.2019textArea
, если я хочу вводить имена по строкам вместо точки с запятой, мне нужно будет изменить эту строку правильноnames <- unlist(strsplit(input[[filterName]], ";"))
23.01.2019