如何在基于闪亮R中的用户输入(向量)创建多个UI元素时避免for循环

时间:2017-04-19 17:42:53

标签: r shiny

我想在我闪亮的应用程序中避免臭名昭着的for循环,但到目前为止我还没有找到解决方案。这是我的第一个真正的闪亮项目,很高兴收到任何意见。

我的场景是:用户提供数据框。然后,该应用程序会为每列生成一个下拉菜单。 (稍后将用于确定是否应将列视为因子,共线或在线性模型中忽略)

我目前的方法是使用for循环和insertUI函数:

ui.R:

library(shiny)
shinyUI(
  fluidPage(
    actionButton("ADD","ADD")
  )
)

server.R

library(shiny)
opts <- c("A","B")
shinyServer(function(input, output) {
  for(i in 1:length(mtcars)){
  insertUI(
        selector = "#ADD",
        where="afterEnd",
      ui=selectInput(paste(names(mtcars[i]),"sel"),names(mtcars[i]),opts)
      )
      }
})

这样可行,但它根本不会感到优雅。 感谢您对我如何改进的意见。

1 个答案:

答案 0 :(得分:1)

我将使用lapply并将结果包装在tagList中以创建一系列选择器。

library(shiny)
library(ggplot2)

shinyApp(
  ui = 
    shinyUI(
      fluidPage(
        selectInput(inputId = "data",
                    label = "Select a dataset",
                    choices = c("mtcars", "iris")),
        uiOutput("select_control")
      )
    ),

  server = 
    shinyServer(function(input, output, session){

      dataset <- eventReactive(input$data,
                               get(input$data))


      output$select_control <- 
        renderUI({
          tagList(
            lapply(names(dataset()),
                   function(x)
                   {
                     selectInput(inputId = sprintf("select_control_%s",
                                                   x),
                                 label = x,
                                 choices = unique(dataset()[[x]]))
                   }
            )
          )
        })
    })
)