繁体   English   中英

R:通过renderUI筛选带有if条件的selectInput的结果

[英]R: filter result from selectInput by renderUI shiny with if condition

在下面的示例中,我有四个selectInput,但是在我真正的闪亮应用程序中,我实际上有六个。 我希望第一棵树中的选择selectInput(major,gender,course)更改最后一个树中的可能选择(学生名)。 因此,前三个selectInput就像最后一个的过滤器一样工作。
  • 例如,如果用户在性别selectInput中选择“男”,则学生名selectInput中的选项应仅显示男学生的姓名。
  • 如果用户在性别selectInput中选择“男”,在专业selectInput中选择“ A”,则学生名selectInput中的选项应仅显示专业A的男学生的姓名。

我在下面有一些代码,但是效果不佳。 非常感谢任何人的帮助!

这是数据示例
 df = data.frame(Studentname = c("aa","aa","aa","bb","bb","bb","cc","cc","dd","ee","ff","gg"), Major = c("A","A","B","B","B","B","C","C","A","A","C","C"), Gender = c("female","female","female","male","male","male","male","male","female","female","male","male"), Course = c("01","02","03","01","03","04","02","04","01","03","02","04"),stringsAsFactors=F) 
码:
  library(shiny) ui = (fluidPage( titlePanel("Test"), sidebarLayout( sidebarPanel( uiOutput("choose_maj"), uiOutput("choose_gen"), uiOutput("choose_cou"), uiOutput("choose_stu") ), mainPanel() ) )) server = function(input,output,session){ output$choose_maj = renderUI({ selectInput("maj.in","Choose Major", choices = c("All",unique(df$Major)),selected="All") }) output$choose_gen = renderUI({ selectInput("gen.in","Choose Gender", choices= c("Both",unique(df$Gender)),selected = "Both") }) output$choose_cou = renderUI({ selectInput("cou.in","Choose Course", choices= c("All",unique(df$Course)),selected = "All") }) output$choose_stu = renderUI({ if(input$maj.in != "All"){ dat <- df[which(df$Major == input$maj.in),] } if(input$gen.in != "Both"){ dat <- df[which(df$Gender == input$gen.in),] } if(input$cou.in != "All"){ dat <- df[which(df$Course == input$cou.in),] } selectInput("stu.in", "Choose Student Name", choices = as.list(unique(dat$Studentname)), selected = "All") }) } runApp(list(ui = ui, server = server)) 

如果仅将data.frame的副本提供给renderUI函数,则可以执行所有不同的子集。

这对我有用:

output$choose_stu = renderUI({

    dat <- df

    if(input$maj.in != "All"){
        dat <- dat[which(dat$Major == input$maj.in),]

    }
    if(input$gen.in != "Both"){
        dat <- dat[which(dat$Gender == input$gen.in),]

    }
    if(input$cou.in != "All"){
        dat <- dat[which(dat$Course == input$cou.in),]
    }

    selectInput("stu.in", "Choose Student Name", 
                choices  = as.list(unique(dat$Studentname)),
                selected = "All")
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM