shivani gupta
shivani gupta

Reputation: 91

To create numericinput for all columns in a data set using renderui

I am trying to create numeric boxes for all column names in a data set. I have written below code but this displays a blank page. Not sure what the error is. Any suggestions?

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)
      }}
      )})

Upvotes: 0

Views: 220

Answers (2)

Carl Boneri
Carl Boneri

Reputation: 2722

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)

Results in: enter image description here

Upvotes: 1

Mike H.
Mike H.

Reputation: 14370

First off, when you ask questions you should ALWAYS post a minimal reproducible example. That is basically something that we can run to replicate the issue you are having so that it is much easier for us to help you. This way we don't have to go about using different data, trying to figure out exactly what your error is. See this link for a good intro: How to make a great R reproducible example?

Next to your question - since you didn't explicitly post an error you were seeing or explicitly state what your issue was I'm going to go ahead and assume that your issue is that you don't see any UI's popping up when you run your Shiny App (this is what I got when I tried running your code with different sample data).

The reason you aren't seeing anything is because you aren't returning any objects from your for loop. If you really wanted to do a for loop you would have to loop through, store everything in a list, then return that list. Note that I had to use R's built in data because you didn't provide any. Something like this would work:

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)
    })})

This should give you your desired result. However, the above is unnecessarily complicated. I suggest you use an lapply instead. Something like this is much better in my opinion:

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)}) 
    })})

Upvotes: 1

Related Questions