简体   繁体   中英

radioButtons() vs. uiOutput() and observeEvent(input[[“”]] - shiny

I try to observe an event in shiny. If I define a radio manually, it will be observed correctly - output: print(paste0("SELECT * FROM daten;")) . I want to avoid writing several tenths of radio buttons in ui.r. Thus I wrote a loop in the server part. But the same observeEvent() does not react on my "loop-listed" radio buttons which where correctly built in shiny app. I have no idea why.

I wrote a minimal example:

library(shiny)

shinyApp(
  ui = fluidPage(
    
    ####### manually set radio #######
    print("This radio 'pd1' will be observed:"),
    radioButtons(inputId = "pd1", label = "value:", choices = c("?", "0", "1")),
    br(), br(),
    
    ####### versus looped set set radio #######
    
    uiOutput("scrlst"),
  ),
  
  server = function(input, output) {
    
    tablscr <- data.frame("1","question")
    
    ###################### observeEvent
    ##### "counter" for several items (in this case just 1 item)
    rv <- reactiveValues(counter = 0)
    lapply(1:dim(tablscr)[1], function(i) {
      isolate({qnum <- paste0('pd', rv$counter <- rv$counter + 1)})
      observeEvent(input[[qnum]], {print(paste0("SELECT * FROM daten;"))})
    })
    
    ### output for tenths of items in one loop  (in this case just 1 item)
    output$scrlst <- renderUI({
      tagList(
        scr <- list(),
        for (sq in 1:dim(tablscr)[1]){
          scr[[sq]] = list(sq,
                           print("This radio 'pd1' will not be observed:"),
                           radioButtons(inputId = "pd1", label = "value:", choices = c("?", "0", "1")),
                           br(),
                           br()
          )
        },
        return(scr),
      )
    })
  }
)

Your tagList containing a loop and a return statement sounds weird. Moreover you have a duplicated id pd1 . Here is a working code:

library(shiny)

shinyApp(
  ui = fluidPage(
    
    uiOutput("scrlst")
    
  ),
  
  server = function(input, output) {
    
    tablscr <- data.frame(c("1","2"), c("question", "hello"))
    
    lapply(1:nrow(tablscr), function(i) {
      qnum <- paste0('pd', i)
      observeEvent(input[[qnum]], {print(paste0("SELECT * FROM daten;"))})
    })
    
    output$scrlst <- renderUI({
      do.call(tagList, lapply(1:nrow(tablscr), function(i){
        tagList(
          radioButtons(paste0("pd", i), label = "value:", choices = c("?", "0", "1")),
          br(), br()
        )
      }))
    })
    
  }
)

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