有没有办法在Shiny App上放置一个过滤器,但是Shiny知道如果没有选择显示所有数据的话?例如,使用ggplot2
diamonds
数据,我构建了以下内容:
library(ggplot2)
library(shiny)
library(dplyr)
diamonds <- diamonds
#Unique cut dropdown
cut <- sort(unique(diamonds$cut))
#Unique color
color <- sort(unique(diamonds$color))
#Unique clarity
clarity <- sort(unique(diamonds$clarity))
#Shiny App
ui <- fluidPage(
titlePanel("diamonds"),
fluidRow(
column(3,
selectizeInput("CutSelect", "Cut", cut, selected = NULL, multiple = TRUE),
br(),
selectInput("ColorSelect", "Color", color),
br(),
selectInput("ClaritySelect", "Clarity", clarity)
),
tableOutput("results")
)
)
server <- function(input, output) {
output$results <- renderTable({
filtered <-
diamonds %>%
filter(cut == input$CutSelect,
color == input$ColorSelect,
clarity == input$ClaritySelect)
filtered
})
}
shinyApp(ui = ui, server = server)
生成一个看起来像这样的应用程序:
如果没有清理数据,有没有办法添加&#34; All&#34;对过滤器的操作符将允许应用程序知道即使有该维度的过滤器,也存在&#34;全部&#34;会派上用场吗?
对于剪辑,特别是,如果我留下selectizeInput
空白,我希望将其作为&#34; All&#34;或&#34;没有过滤器&#34;打字。
很高兴提供更多有用的信息。
感谢。
答案 0 :(得分:2)
我建议在呈现/过滤数据时使用DT。 DT具有内置的过滤器选项,允许您过滤表中的一个或多个值或值范围。您可以将过滤器放在表格的顶部或底部。以下是符合您目标的代码:
library(ggplot2)
library(shiny)
library(DT)
diamonds <- diamonds
#Shiny App
ui <- fluidPage(
titlePanel("diamonds"),
fluidRow(
dataTableOutput("results")
)
)
server <- function(input, output) {
output$results <- DT::renderDataTable(filter='top',{
diamonds
})
}
shinyApp(ui = ui, server = server)
答案 1 :(得分:0)
空selectInput
会返回NULL
,因此只有在selectInput
不是NULL
时(即已选择了一个或多个值)才能进行过滤:
server <- function(input, output) {
output$results <- renderTable({
filtered <- diamonds
if (!is.null(input$CutSelect)) {
filtered <- filtered %>% filter(cut == input$CutSelect)
}
if (!is.null(input$ColorSelect)) {
filtered <- filtered %>% filter(color == input$ColorSelect)
}
if (!is.null(input$ClaritySelect)) {
filtered <- filtered %>% filter(clarity == input$ClaritySelect)
}
filtered
})
}
这样,如果selectInput
为空(NULL
),则不对该维度执行过滤。