Shiny应用点击actionButton时如何捕获被点击按钮的ID
Shiny点击按钮时捕获按钮ID的实现方式
首先明确Shiny的默认机制:input$<actionButton的ID>存储的值永远是该按钮的累计点击次数,是带shinyActionButtonValue属性的整数值,本身不会返回按钮的ID字符串,直接打印input$show拿不到"show"是框架默认设计导致的。
你当前定义的按钮代码如下:
actionButton("show",class = "act_button", list(span(class="top left", "Model 1"), span(class="top right", Sys.time())))
根据实际使用场景,可以选以下两种方案实现需求:
- 单按钮固定场景:直接在监听逻辑内指定ID即可,代码最简洁
observeEvent(input$show,{ btn_id <- "show" print(btn_id) # 运行后输出就是预期的"show" }) - 多按钮批量监听场景:如果页面有多个同类型操作按钮(比如多个带
act_button类的模型选择按钮),不想给每个按钮单独写监听逻辑,可以通过前端JS传参实现自动捕获被点击按钮的ID:- 在UI部分加入JS监听代码,给所有带
act_button类的按钮绑定点击事件,点击时把按钮ID传给后端:
# 放在UI内任意位置即可 tags$script(HTML(" $(document).on('click', '.act_button', function() { Shiny.setInputValue('last_clicked_btn', this.id, {priority: 'event'}); }) "))- 后端统一监听传入的ID值即可,不管点击哪个同类型按钮都能拿到对应ID:
observeEvent(input$last_clicked_btn, { print(input$last_clicked_btn) # 点击show按钮时就会输出"show" }) - 在UI部分加入JS监听代码,给所有带
补充说明:JS里加
{priority: 'event'}参数是为了避免重复点击同一个按钮时,Shiny因为输入值没变化不触发响应的问题,保证每次点击都能被后端正常捕获。
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

