Динамический фильтр на основе условной панели в Shiny R - PullRequest
0 голосов
/ 01 ноября 2019

Я не знаком с Shiny, и мне было интересно, не могли бы вы помочь мне с динамической фильтрацией. На основании уроков, которые я прочитал, я смог придумать это до сих пор. Проблема, с которой я сталкиваюсь, заключается в том, что «Freq» не изменяется динамически, когда выбран конкретный тип Dept, Gender и Admit. По сути, я бы хотел, чтобы частота уменьшалась до одного значения, когда в каждом поле есть выбор. Как я могу получить выбор пользователя в разделе «Выберите пол» и «Выбрать тип допуска:», чтобы я мог использовать его для индексации кадра данных? Спасибо.

library(shiny)

Admit<-c("Admitted","Rejected","Admitted", "Rejected", "Admitted", "Rejected", "Admitted",
         "Rejected","Admitted", "Rejected", "Admitted","Rejected","Admitted", "Rejected","Admitted","Rejected", "Admitted", "Rejected",
         "Admitted","Rejected", "Admitted" ,"Rejected","Admitted", "Rejected")
Gender<-c("Male","Male","Female","Female", "Male",   "Male",   "Female", "Female", "Male","Male","Female","Female",
          "Male","Male","Female","Female","Male",   "Male",   "Female", "Female","Male","Male","Female","Female")
Dept<-c( "A","A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "F", "F", "F", "F")
Freq<-c("512", "313",  "89",  "19", "353", "207",  "17",   "8", "120", "205", "202", "391", "138", "279", "131", "244",  "53", "138",
        "94", "299",  "22", "351",  "24", "317")

df<-data.frame(Admit,Gender,Dept, Freq)

#df<-data.frame(UCBAdmissions)

# Define UI ----
ui <- fluidPage(
  titlePanel("UC Berkley Admissions"),

  sidebarLayout(

    sidebarPanel(
      helpText("Apply Filter to achieve desired results."),

      selectInput('Dept', choices = c("-",df$Dept), label = 'Select a Dept'), 

      conditionalPanel(condition = "input.Dept != '-'",
                       uiOutput("select_Dept"),
                       uiOutput("select_Admit"),
                       uiOutput("Freq"))
    ),

    mainPanel(
      textOutput("Add Data here later"),)
  )
)

# Define server logic ----
server <- function(input, output) {
  output$select_Dept <- renderUI({
    choices<-unique(df$Gender)
    checkboxGroupInput('Projects', label = 'Select Gender',
                       choices = choices)
  })

  output$select_Admit<-renderUI({
    Admit<-unique(df$Admit)
    checkboxGroupInput('Projects', label = 'Select Admit Type:',
                       choices = Admit) 
  })

  output$Freq<-renderUI({
    Freq<-sort(df$Freq[grep(input$Dept,df$Dept)])
    selectInput('sample', choices =Freq, label ='Select Freq')
  })
}


# Run the app ----
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 04 ноября 2019

В вашем примере может помочь несколько вещей:

Для selectInput для отдела вы, вероятно, захотите использовать levels из df$Dept вместо простого включения df$Dept (все данные).

С этим изменением Select Freq будет работать несколько, но не будет фильтровать на основе Admit или Gender. Для фильтрации по всем трем параметрам (Dept, Admit, Gender) потребуется отдельная функция reactive для фильтрации ваших данных.

Надеюсь, что это полезно.

library(shiny)

# Define UI ----
ui <- fluidPage(
  titlePanel("UC Berkley Admissions"),
  sidebarLayout(
    sidebarPanel(
      helpText("Apply Filter to achieve desired results."),
      selectInput('Dept', choices = c("-", levels(df$Dept)), label = 'Select a Dept'), 
      conditionalPanel(condition = "input.Dept != '-'",
                       uiOutput("select_Dept"),
                       uiOutput("select_Admit"),
                       uiOutput("Freq"))
    ),
    mainPanel(
      textOutput("Add Data here later"))
  )
)

# Define server logic ----
server <- function(input, output) {

  Freq <- reactive({
    subset1 <- df[grep(input$Dept, df$Dept), ]
    subset2 <- subset1[(df$Admit %in% input$ProjectAdmit) & (df$Gender %in% input$ProjectGender), ]
    return(sort(subset2$Freq))
  })

  output$select_Dept <- renderUI({
    choices<-unique(df$Gender)
    checkboxGroupInput('ProjectGender', label = 'Select Gender:',
                       choices = choices)
  })

  output$select_Admit<-renderUI({
    Admit<-unique(df$Admit)
    checkboxGroupInput('ProjectAdmit', label = 'Select Admit Type:',
                       choices = Admit) 
  })

  output$Freq<-renderUI({
    selectInput('sample', choices =Freq(), label ='Select Freq')
  })
}

# Run the app ----
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...