在闪亮的应用中添加“输入过滤器”中的“所有值”

时间:2017-06-16 14:48:58

标签: r shiny

我的应用程序运行良好,但我想添加一个允许用户选择变量的所有值的选项。 例如,对于第一个过滤器,我想要“All”之类的东西,其中包括“A”,“B”和“C”。 与其他过滤器一样,我尝试了许多技巧,但我无法解决这个问题。 任何帮助将不胜感激

library(shiny)
library(DT)
library(dplyr)

VG <- c("A", "A", "B", "B", "B", "C", "A")
AG <- c(1, 2, 1, 3, 4, 2, 1)
AP <- letters[1:7]
AK <- paste(VG, AG, AP, sep = "-")
data <- data.frame(VG, AG, AP, AK)

ui <- fluidPage(
  column(3,
         selectInput("VG", label = h4("VG.ETD"), choices = unique(data$VG)),
         selectInput("AG", label = h4("AG.ETD"), choices = unique(data$AG))),
  column(3,
         selectInput("AP", label = h4("AP.ETD"), choices = unique(data$AP)),
         selectInput("AK", label = h4("AK.ETD"), choices = unique(data$AK)),
         actionButton("go", "GO")),
  column(6,DT::dataTableOutput("dtt"))
)

server<-function(input,output,session){



  observeEvent(input$VG,{
    updateSelectInput(session, 'AG', choices = unique(data$AG[data$VG %in% input$VG]))
  })

  observeEvent(c(input$VG, input$AG),{
    updateSelectInput(session, 'AP', choices = unique(data$AP[data$AG %in% input$AG &
                                                              data$VG %in% input$VG]))
  })

  observeEvent(c(input$VG, input$AG, input$AP), {
    updateSelectInput(session, 'AK', choices = unique(data$AK[data$AP %in% input$AP &
                                                              data$AG %in% input$AG &
                                                              data$VG %in% input$VG]))
  })

  df <- eventReactive(input$go, {
    data %>% filter(VG %in% input$VG, 
                    AG %in% input$AG,
                    AP %in% input$AP,
                    AK %in% input$AK)

  })

  output$dtt <- DT::renderDataTable({
    df()

  })

}

shinyApp(ui=ui,server=server)

1 个答案:

答案 0 :(得分:1)

为了解决过去类似的问题,我采用了以下方法:

  1. 创建了一个向量,其中包含我想要使用的过滤器选项的名称(在本例中为“所有状态”以及数据框状态列中的实际唯一变量的拉德

    states <- c("All states", levels(rudd$State))
    
  2. 在输入面板中使用矢量值作为可能的输入(状态[1](=“所有状态”)是默认选择)

    selectInput("state", "Choose a state:", choices = states, selected = states[1])
    
  3. 创建了一个条件语句,根据用户输入选择要显示的正确数据子集(并继续将临时的子表格传递给反应输出)

    library("dplyr")
    
    dat <- reactive({
        if (input$State!="All states"){ 
        temp <- state_map %>%
        filter(State== tolower(input$State)) 
    } else { 
        temp <- state_map[1,] 
    }
    })
    
  4. 换句话说,如果选择了特定状态,则会根据此选择过滤数据框,否则所有行都将传递到交互式输出。

    整个代码在这里:https://github.com/DrRadan/RiskEcon-Shiny-App/blob/master/Health.Rmd 及其在此处的实施:https://rdna.shinyapps.io/Health/

    我希望这会有所帮助。