【问题标题】:R: filter result from selectInput by renderUI shiny with if conditionR:通过带有 if 条件的 renderUI 过滤来自 selectInput 的结果
【发布时间】:2015-10-20 16:08:23
【问题描述】:
在下面的示例中,我有四个 selectInput,但在我真正闪亮的应用程序中,我实际上有六个。我希望在第一棵树 selectInput(major,gender,course) 中的选择可以更改最后一个树中的可能选择(学生名)。所以前三个 selectInput 就像最后一个的过滤器一样工作。
  • 例如,如果用户在性别选择输入中选择“男性”,那么 studentname selectInput 中的选项应仅显示名称 男学生。
  • 如果用户在性别选择输入中选择“男性”,在专业中选择“A” selectInput,那么 studentname 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))

【问题讨论】:

    标签: r if-statement shiny render


    【解决方案1】:

    如果您只是将您的 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")
    })
    

    【讨论】:

    • 谢谢。但似乎 if 条件的逻辑不正确?例如,如果我选择专业 A 和男性,它会返回一个错误的名单。另外,如果我选择女性和课程01,结果也是错误的。
    • @ouou,输出对我来说是正确的。 Major A & male 返回 none,female/course 01 返回 aa 和 dd。你确定你覆盖了以前的renderUI 并再次运行所有内容?
    • 对不起,我没有覆盖所有这些。它工作得很好!非常感谢!
    • 你能解释一下为什么需要renderUI中的df副本吗?我不太明白。
    • @ouou 因为按照您的初始逻辑,只有最后一个过滤器将直接应用于df 对象。如果您想要多个过滤器,则需要将过滤器应用于先前过滤的对象。手动尝试一些子集以查看它的实际效果。
    猜你喜欢
    • 1970-01-01
    • 2020-10-20
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2018-06-14
    • 2018-07-26
    相关资源
    最近更新 更多