基于等于“None Selected”= NA的Shiny用户输入过滤数据帧

时间:2017-06-21 23:08:06

标签: r shiny dplyr

使用Shiny,我试图根据用户输入过滤数据帧,然后显示过滤后的数据帧。我很难找到一种策略,允许我在适用时不过滤数据框并显示未过滤的数据框。我搜索了Stack Overflow的帮助,发现了类似的问题R - Shiny Filter for 'All' values。我试图实施Kristoffer Winther Balling推荐的解决方案,但没有成功。当我选择“None Selected”选项时,将显示一个空表而不是未过滤的表。

library(shiny)
library(tidyverse)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      radioButtons(inputId = "cut", label = "Select Cut",
                   choiceNames = c(levels(as.factor(diamonds$cut)), "None Selected"),
                   choiceValues = c(levels(as.factor(diamonds$cut)), NA))
    ),
    mainPanel(tableOutput("diamonds_filtered"))
  )
)

server <- function(input, output) {
  output$diamonds_filtered <- renderTable({
    diamonds_filtered <- diamonds
    if (!is.na(input$cut)) {
      diamonds_filtered <- filter(diamonds_filtered, cut == input$cut)
    }
    head(diamonds_filtered)
  })
}

shinyApp(ui, server)

对不等于NA的用户输入进行过滤可按预期工作。 Proper filtering

然而,当输入为“未选择”且值为NA时,不显示未过滤的数据帧。 improper filtering

非常感谢任何关于我可能做错的建议。

1 个答案:

答案 0 :(得分:0)

正如@HubertL在上面的评论中所推荐的那样,如果我更改&#34;无选择&#34;的值选项=&#34;&#34;并将我的if改为f (input$cut!="") {...我得到了所需的功能。

library(shiny)
library(tidyverse)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      radioButtons(inputId = "cut", label = "Select Cut",
                   choiceNames = c(levels(as.factor(diamonds$cut)), "None Selected"),
                   choiceValues = c(levels(as.factor(diamonds$cut)), ""))
    ),
    mainPanel(tableOutput("diamonds_filtered"))
  )
)

server <- function(input, output) {
  output$diamonds_filtered <- renderTable({
    diamonds_filtered <- diamonds
    if (input$cut != "")) {
      diamonds_filtered <- filter(diamonds_filtered, cut == input$cut)
    }
    head(diamonds_filtered)
  })
}

shinyApp(ui, server)