Home > OS >  Shiny App: Adding unlimited number of input bars
Shiny App: Adding unlimited number of input bars

Time:01-05

I want to build an app in which the user can add as many as input slots as he wants. I could only build an app that let the user to add only one more input slot. Here is my code:

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
          
                selectizeInput("a", "Something", choices = "blah blah"),
                uiOutput("b"),
                actionButton(inputId = "rm", label = "-"),
                actionButton(inputId = "add", label = " "),
            ),

    mainPanel(
      textOutput("test")
      
    )
  )
)


server <- function(input, output) {
  
  observeEvent(input$add ,{
    
    output$b <- renderUI({
      selectizeInput("b", "Another thing", choices = "blah blah")
    })
    
  })
  
  observeEvent(input$rm ,{
    
    output$b <- renderUI({
      
      NULL
      
    })
    
  })
  
}

shinyApp(ui = ui, server = server)

I have no idea how I can extend this to let the user add as many as input slots as he wants. Is this even possible?

CodePudding user response:

We can try this approach:

We can access new added inputs with input$a1, input$a2 ... input$ax

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectizeInput("a", "Something", choices = "blah blah"),
      actionButton(inputId = "rm", label = "-"),
      actionButton(inputId = "add", label = " "),
    ),
    mainPanel(
      textOutput("test")
    )
  )
)


server <- function(input, output) {
  input_counter <- reactiveVal(0)

  observeEvent(input$add, {
    input_counter(input_counter()   1)
    insertUI(
      selector = "#rm", where = "beforeBegin",
      ui = div(id = paste0("selectize_div", input_counter()), selectizeInput(paste0("a", input_counter()), label = "Another thing", choices = c("bla", "blabla")))
    )
  })
  observeEvent(input$rm, {
    removeUI(
      selector = paste0("#selectize_div", input_counter())
    )
    input_counter(input_counter() - 1)
  })
}

shinyApp(ui = ui, server = server)
  •  Tags:  
  • Related