Shinydashboard: фильтрация DT по textInput - PullRequest
0 голосов
/ 28 июня 2018

Я хочу создать довольно простую функциональность, в которой пользователь выбирает файл для обработки, а затем различные выходные данные, основанные на содержимом файла full , отображаются в различных таблицах data.table на нескольких вкладках меню. Кроме того, я хочу, чтобы пользователь мог фильтровать все эти data.tables по значению, присутствующему во всех выходных данных, которые будут взяты из поля textInput. Таким образом, оно должно следовать логике: если textInput пусто, то показывать все записи, в противном случае показывать только те записи, которые соответствуют значению из textInput. Легко, правда?

Вот фиктивный пример:

### ui.R

library(shiny)
library(shinydashboard)
library(DT)

dbSidebar <- dashboardSidebar(
  sidebarMenu(
textInput(inputId = "search_term",
          label = "Search"),

# one of many tabs
menuItem("General Info", tabName = "general_info", icon = icon("info-sign", lib = "glyphicon")),

downloadButton('downloadData', 'Download',
               icon("paper-plane"), 
               style="color: #fff; background-color: #337ab7; border-color: #2e6da4;
               margin-top: 20px; margin-left: 15px;")
    )
  )

general_info_tab <- tabItem(tabName = "general_info",
                           fluidRow(
                             box(h2("Companies House Search Data"),
                                 DT::dataTableOutput('searchTable')
                                 ),
                             width = 12)
                           )

dashboardPage(
  dashboardHeader(),
  dbSidebar,
  dashboardBody(
tabItems(
  general_info_tab
    )
  )
)


### server.R

library(shiny)
library(shinydashboard)
library(DT)
library(dplyr)

# my hypothetical file content
dummy_data <- data.frame(
  a = rep(c(1,2,3), 6),
  b = rep(c("A2746", "38504", "CD759")),
  fruit = rep(c("apple", "pear"), each = 9)
)



shinyServer(function(input, output, session) {

  output$searchTable = DT::renderDataTable({

    selected <- dummy_data

if(!is.null(input$search_term) ||
   !is.na(input$search_term) ||
   length(input$search_term) > 0 ||
   input$search_term != "") {

  selected <- filter(dummy_data, b == input$search_term)

}

DT::datatable(selected)

  })
})

С этим кодом я вижу пустой набор данных , если только у меня нет значений textInput. Как сделать так, чтобы он отображался как полный набор данных по умолчанию (когда поле textInput пусто) и отфильтровывал его при написании текста? Спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Столбец b хранится как факторы Я думаю, и метод фильтра не работает правильно.

В следующем примере столбец b преобразуется в символ, и в нем используется частичное совпадение для столбца b.

Я использовал пакет tidyselect для частичной фильтрации, хотя вы также можете сделать это только с dplyr. Тогда вы должны заменить фильтр на этот: filter(dummy_data, grepl(input$search_term, b)).

library(tidyselect)

dummy_data$b <- as.character(dummy_data$b)

server <- shinyServer(function(input, output, session) {

  output$searchTable = DT::renderDataTable({
    selected <- dummy_data
    if (input$search_term != "") {
      selected <- filter(dummy_data, b == vars_select(dummy_data$b, contains(input$search_term)))
    }
    DT::datatable(selected)
  })

})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...