在Shiny应用程序中使用函数renderUI(selectInput())

时间:2018-01-30 05:53:43

标签: r shiny

这里是server.r

server <- function(input, output) {
  output$species <- renderUI({
     selectInput("species", 
                 label = "blah", 
                 choices = as.list(unique(iris$Species)))
      })
}

然后在ui.r

ui <- fluidPage(
   fluidRow(        
       uiOutput("species")
)

这按预期工作,下拉选择输入如下所示: enter image description here

由于我有多个功能,我需要在实际数据框中创建一个类似的过滤器,我尝试用一​​个函数做同样的事情:

在server.r

  outputFilters <- function(id, df) {
    output$id <- renderUI({
     selectInput(id, 
                 label = "blah", 
                 choices = as.list(unique(df$id)))
      })
  }

outputFilters("species", iris)

然后在ui.r中与uiOutput("species")之前相同

但是,现在没有下拉列表。据推测,我的功能有缺陷。如何使用函数生成下拉?

2 个答案:

答案 0 :(得分:2)

您的问题是每个UI元素在id

中都需要自己的output
 outputFilters <- function(id, df) {
    output[[id]] <- renderUI({
     selectInput(id, 
                 label = "blah", 
                 choices = as.list(unique(df[[id]])))
      })
  }

现在只要id是函数输入中的字符串,它就应该生成输出元素,你可以参考id

然后,您甚至可以使用lapply来迭代弗洛里安建议的众多内容。

答案 1 :(得分:1)

请注意,在这种情况下,您也可以不使用单独的函数,方法是将所需的ui组件包装在lapply中,或将lapply放在uiOutput中以创建所有输入一次,下面是两个案例的一个例子。希望这有帮助!

ibrary(shiny)

ui <- fluidPage(
  uiOutput('Species'),
  uiOutput('Sepal.Length'),
  h2('All inputs: '),
  uiOutput('my_inputs')
)


server <- function(input, output) {

  # Use lapply to create multiple uiOutputs.
  lapply(colnames(iris), function(x){
    output[[x]] <- renderUI({
      selectInput(paste0('input_',x), 
                  label = x, 
                  choices = as.list(unique(iris[['x']])))
    })
  })

  # Create all dropdown's at once.
  output$my_inputs <- renderUI({
    lapply(colnames(iris), function(x){
      selectInput(paste0('input_',x), 
                  label = x, 
                  choices = as.list(unique(iris)))
    })
  })

}

shinyApp(ui, server)