使用renderui为数据集中的所有列创建numericinput

时间:2017-03-06 16:12:32

标签: r shiny

我正在尝试为数据集中的所有列名创建数字框。我写了下面的代码,但这显示一个空白页面。不确定错误是什么。有什么建议吗?

library(shiny)
library(readr)  

shinyApp(
  ui <- fluidPage(
    uiOutput("TestColumns")
  ),
  server <- function(input, output) {
    data_set <- read.csv("Data/170210_Flat_File.csv")
    output$TestColumns <- renderUI({

      for(i in names(data_set)){
        numericInput(i, i,30)
      }}
      )})

2 个答案:

答案 0 :(得分:1)

首先,当您提出问题时,您应该始终发布一个可重复性最小的示例。这基本上是我们可以运行以复制您所遇到的问题,以便我们更容易帮助您。这样我们就不必使用不同的数据,试图找出你的错误究竟是什么。请参阅此链接以获取良好的介绍:How to make a great R reproducible example?

在您的问题旁边 - 因为您没有明确发布您遇到的错误或明确说明您的问题是什么我将继续并假设您的问题是您没有看到任何UI突然出现当你运行你的Shiny App时(这是我在尝试使用不同的样本数据运行代码时得到的结果)。

您没有看到任何内容的原因是因为您没有从for loop返回任何对象。如果你真的想做for loop,你必须循环,将所有内容存储在列表中,然后返回该列表。请注意,我必须使用R的内置数据,因为您没有提供任何内容。像这样的东西会起作用:

shinyApp(
  ui <- fluidPage(
    #numericInput("test","test",30),
    uiOutput("TestColumns")
  ),
  server <- function(input, output) {
    data_set <- mtcars

    output$TestColumns <- renderUI({
      L<-vector("list",length(names(data_set)))
      for(i in names(data_set)){
        L[[i]]<-numericInput(i, i,30)
      }
      return(L)
    })})

这应该会给你你想要的结果。但是,上述情况不必要地复杂化。 我建议您使用lapply代替。在我看来,像这样的东西好多了

shinyApp(
  ui <- fluidPage(
    #numericInput("test","test",30),
    uiOutput("TestColumns")
  ),
  server <- function(input, output) {
    data_set <- mtcars

    output$TestColumns <- renderUI({
      lapply(names(data_set),function(x){numericInput(x,x,30)}) 
    })})

答案 1 :(得分:1)

ui <- bootstrapPage(
  fluidRow(
    column(4,offset = 2,
           tags$h4("numeric inputs"),
           uiOutput('mtcars_numerics') # These will be all the numeric inputs for mtcars
    ),
    column(6,
           tags$h4("current input values"),
           verbatimTextOutput('show_vals') # This will show the current value and id of the inputs
    )
  )
)


server <- function(input, output, session){

  # creates the output UI elements in the loop
  output$mtcars_numerics <- renderUI({
    tagList(lapply(colnames(mtcars), function(i){ # must use `tagList` `
      column(3,
             numericInput(
               inputId = sprintf("mt_col_%s",i), # Set the id to the column name
               label = toupper(i), # Label is upper case of the col name
               min = min(mtcars[[i]]), # min value is the minimum of the column
               max = max(mtcars[[i]]), # max is the max of the column
               value = mtcars[[i]][[1]] # first value set to the first row of the column
             ))
      })
    )
  })

  # So we can see the values and ids in the ui for testing
  output$show_vals <- renderPrint({
    all_inputs <- names(session$input)
    input_vals <- plyr::ldply(all_inputs, function(i){
      data.frame(input_name = i, input_value = input[[i]],stringsAsFactors = FALSE)
    })

    input_vals
  })
}

shinyApp(ui, server)

结果: enter image description here