简体   繁体   中英

R Shiny: Dynamic Row of Action Buttons

I want to have a set of two action buttons in Shiny where the inputID and number of duplicates is based off the number of rows in a data.frame. Attached below is my thought process that isn't currently functioning correct. Instead of adding a button whenever a button is pressed, I want "n" sets of buttons equal to the number of rows in a data.frame.

library(shiny)

ui <- basicPage(
fluidRow(
 actionButton(inputId = "add_button",
             label = "Add Button")
 ),
 uiOutput("more_buttons")
 )

server <- function(input, output){

 rvs      <- reactiveValues(buttons = list(actionButton(inputId = "button1",
                                                     label = 1)))

observeEvent(eventExpr = input$add_button,
           handlerExpr = {
             len      <- length(rvs$buttons) + 1
             rvs$buttons[[len]] <- actionButton(inputId = paste0("button",len),
                                                label = len)
           })

 output$more_buttons <- renderUI({
  do.call(fluidRow, rvs$buttons)
   })

 observeEvent(rvs$buttons,{
for(ii in 1:length(rvs$buttons)){
  local({
    i <- ii
    observeEvent(eventExpr = input[[paste0("button",i)]],
                 handlerExpr = {print(sprintf("You clicked btn number %d",i))})
  })
  }
 })

}

shinyApp(ui, server)

Here is a simplified version of what you want to accomplish

ui <- fluidPage(
  selectInput("df", "choose a dataframe",
              c("mtcars", "mpg")),
  uiOutput("buttons")
)

server = function(input, output, session){
  reactiveFrame = reactive({
    if(input$df == "mtcars")
      return(mtcars)
    return(ggplot2::mpg)
  })
  nrowR = reactive({
    nrow(reactiveFrame())
  })
  m <- 0
  output$buttons = renderUI({
    m <- m+1
    do.call(
      fluidPage,
      lapply(
        1:nrowR(),
        function(i)
          span(
            actionButton(paste0("a", i, "-", m),paste0("a", i)),
            actionButton(paste0("b", i, "-", m),paste0("b", i))
          )
      )
    )
  })
}

shinyApp(ui,server)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM