关于 r:与独特的 observeEvent 相关联的 actionButtons 的动态数量

Dynamic number of actionButtons tied to unique observeEvent

我想生成动态数量的 actionButton,然后让每个生成的按钮将其编号打印到控制台。这是迄今为止我最好的尝试,但我仍然无法为前 10 个按钮中的每一个获取observeEvent 以识别按钮点击。如何将按钮绑定到观察事件?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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)
  })

  # This is the part that doesn't work
  for(ii in 1:10){
    observeEvent(eventExpr = input[[paste0("button",ii)]],
                 handlerExpr = print(ii))
  }

}

shinyApp(ui, server)

你真的很接近,只需将 observeEvent 部分package在本地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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)


让按钮的 inputIds 遵循类似 "button1"、"button2"、"button3" 的模式,使用正则表达式将这些 inputIds 与 observeEvent 触发器中的 \\'input\\' 对象隔离开来, 并将结果转换为列表:

1
2
3
4
5
6
7
8
9
10
11
 observeEvent(
     lapply(
        names(input)[grep("button[0-9]+",names(input))],
        function(name){
           input[[name]]
        }
     ),
    {
      code to run when any button with inputId matching the regex is pressed
    }
  )