R Shiny - фильтр data.frame с checkboxGroupInput - PullRequest
1 голос
/ 30 апреля 2020

Попытка отфильтровать данные во фрейме данных в зависимости от того, какие флажки установлены. Возьмем следующий пример:

if (interactive()) {
  library(DT)

  Dish <- c("Apple Pie", "Apple Cake", "Blueberry Pie", "Lemon", "Carrot", "Chocolate")
  DishNum <- c("123", "456", "789", "12", "34", "56")
  data <- data.frame(Dish, DishNum)

  ui <- fluidPage(
    checkboxGroupInput(inputId = "chkDish",
                       label = "",
                       inline = TRUE,
                       choices = c("Apple", "Blue", "Not Apple or Blue"),
                       selected = c("Apple", "Blue", "Not Apple or Blue")
    ),
    DT::dataTableOutput(outputId = "DT_Dish")
  )

  server <- function(input, output, session) {
    output$DT_Dish <- DT::renderDataTable({
      DT::datatable(
        data,
        rownames = FALSE,
        options = list(
          dom = 't',
          searchHighlight = TRUE,
          pageLength = 100,
          scrollX = TRUE
        )
      )
    })
  }
  shinyApp(ui, server)
}

Если установлен только флажок «Apple», будут отображаться только данные в таблице, начинающиеся с «Apple». Если установлен только «Синий» флажок, он будет отображать только те данные в таблице, которые начинаются с «Синий». Если установлен только флажок «Не Apple или Синий», он будет отображать только данные в таблице, НЕ начинающейся с «Apple» или «Синий».

Если проверена любая комбинация кнопок, будет Отфильтруйте / покажите данные соответствующим образом.

Я понимаю, что мне нужно использовать какой-то подстановочный знак для поднабора данных, но не уверен, что это лучший способ для этого. Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2020

Один из способов добиться этого - настроить фильтры регулярных выражений на основе ваших флажков. Оператор if_else включен для проверки случая не яблоко или синий специфика c. В противном случае будут использоваться значения символов input$chkDisk в регулярном выражении. Все фильтры ищутся с помощью или (|). Посмотрите, обеспечивает ли это желаемое поведение.

library(dplyr)

server <- function(input, output, session) {       
  filtered_data <- reactive({
    req(input$chkDish)
    filters <- if_else(input$chkDish == "Not Apple or Blue", "(?!Apple)(?!Blue)", paste0("(", input$chkDish, ")"))
    filter(data, grepl(paste0("^(", paste0(filters, collapse="|"), ")"), Dish, perl = TRUE))
  })

  output$DT_Dish <- DT::renderDataTable({
    DT::datatable(
      filtered_data(),
      rownames = FALSE,
      options = list(
        dom = 't',
        searchHighlight = TRUE,
        pageLength = 100,
        scrollX = TRUE
      )
    )
  })
}
...