Реактивная фильтрация / поднабор фрейма данных в блестящем - PullRequest
0 голосов
/ 23 февраля 2019

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

Вот воспроизводимый пример:

## app.R ##
library(shiny)
library(shinydashboard)
library(tidyverse)
library(DT)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    selectInput("cut", "Type of cut",
                c("All",as.character(unique(diamonds$cut))), selected = "All", 
                multiple = TRUE)
  ),
  dashboardBody(
    DT::dataTableOutput("table")
  )
)

server <- function(input, output) { 

  selectdata <- reactive({
    diamonds %>% 
      filter(ifelse(any(input$cut == "All"), cut %in% unique(diamonds$cut),
                    cut %in% input$cut))
  })

  output$table <- DT::renderDT({
    selectdata()
  }, options = list(scrollX = TRUE))

}

shinyApp(ui, server)

Приложение работает без ошибок, но когда пользователь удаляет «Все» и выбирает, например, «Premuim» и «Хорошо», ничего не появляется.Тем не менее, когда пользователь выбирает «Идеальный», появляются все строки.Кажется, я не вижу, что я делаю неправильно.

1 Ответ

0 голосов
/ 23 февраля 2019

Я заменил ifelse на простое if условие.Я предполагаю, что это более безопасно, так как пайпинг к filter и затем использование ifelse может привести к ошибке.Рассмотрим этот код сервера:

library(shiny)
server <- function(input, output) { 
    selectdata <- reactive({
        # Give back original data (no filter is needed)
        if (any(input$cut == "All")) {
            diamonds
        } else {
            # Subset data
            # You can also use: base::subset(diamonds, cut %in% input$cut)
            dplyr::filter(diamonds, cut %in% input$cut)
        }
    })
    output$table <- DT::renderDT({
        selectdata()
    }, options = list(scrollX = TRUE))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...