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( server <- function(input, output){ rvs <- reactiveValues(buttons = list(actionButton(inputId =”button1″, observeEvent(eventExpr = input$add_button, output$more_buttons <- renderUI({ # This is the part that doesn’t work } 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( server <- function(input, output){ rvs <- reactiveValues(buttons = list(actionButton(inputId =”button1″, observeEvent(eventExpr = input$add_button, output$more_buttons <- renderUI({ observeEvent(rvs$buttons,{ } shinyApp(ui, server) |
- 这仅在我最多有 10 个按钮时才有效。循环的长度需要是反应性的,这是困难的部分。如果你有解决方案会很好奇。据我所知,您不能在 observe 内动态生成 observeEvents 。
- 很好,我没有注意到观察者的生成最多只能为 10 个按钮工作。我会更新我的答案。如果您想了解如何动态生成和绑定观察者,也许我的 anwser 可以帮助 stackoverflow.com/questions/39330299/…
- 此外,还有另一个问题,您为每个按钮生成多个观察事件,因此当您单击一个按钮时,它会出现多行告诉您刚刚单击的按钮。每次更新按钮时,都会生成一个新的 observeEvent。我发现规避这一点的唯一方法是在反应性值中跟踪所有已生成的观察事件,然后在创建新事件之前对其进行检查。正如我在这里所做的那样:stackoverflow.com/questions/45035083/…
让按钮的 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 } ) |
- 忽略缺少的括号,这不起作用并返回 Can’t index reactivevalues with `[`。您的原始代码将运行,但它至少在闪亮仪表板页面中不断触发。
- 谢谢。我已经编辑了帖子以修复错字。
- 您使用的是哪个版本的 R 和 Shiny 可以正常工作?就像我说的那样,当我尝试这个时,它会引发一个导致整个应用程序崩溃的错误。我发现的解决方法是在 UI 中使用 javascript 来捕获 shiny:inputchanged 并使用 Shiny.setInputValue(‘last_button’, event.name+’_’+BUTTON_CLICK_COUNT) 进行响应,然后使用 if (grepl(“button[0-9]+”,input$last_button)==TRUE) 设置 observeEvent() 以便它只响应所需的以编程方式定义的输入。抓住它是滞后的并且容易发生不必要的触发。
- 我已经更新了答案以使用不同的列表生成方法,让我知道它是否适合您。
- 不幸的是,我不得不放弃这个,因为它在不应该触发的时候一直被触发。我不相信这是你的代码,但是我试图用它来捕获对 shinydashboardplus::dropdownBlock() 中动态生成的项目的点击,我认为 dropdownBlock() 中的某些东西正在产生错误的输入。
来源:https://www.codenong.com/34157684/