我想过滤数据框,以便仅选择类别变量包含闪亮应用程序用户选择的值的行。
以下是可重现的示例:
## 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”和“ Good”什么都没有显示。但是,当用户选择“理想”时,将显示所有行。我似乎看不到我在做什么错。
答案 0 :(得分:1)
我用简单的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))
}