You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny动态拼接input监听DT单元格点击报对象未找到错误

报错原因

input是Shiny框架内置的特殊响应式列表对象,不是普通的R全局环境变量。你用paste0("input$", self$name, "_cell_clicked")拼出来的是一个完整字符串,get()函数会尝试在全局环境中查找名为input$Macrolaag_cell_clicked的独立对象——但$只是R列表取元素的语法糖,从来不存在叫这个名字的对象,自然会触发找不到对象的报错。

你之前动态渲染DT表的UI、服务端逻辑都是正确的,DT自动生成的事件名规则也确实是输出id_cell_clicked,问题只出在动态取input响应式值的写法上。

可行解决方案

Shiny的input、output本质都是支持字符串索引的列表,用双中括号[[传动态字符串取元素,是官方支持的动态访问方式,直接替换掉原来的get()写法即可:

shiny::observeEvent(
  # 注意不要拼input$前缀,直接拼事件名后缀,用[[ ]]访问input
  input[[paste0(self$name, "_cell_clicked")]], 
  {
    # 内部获取点击信息也用同样的索引方式
    click_detail <- input[[paste0(self$name, "_cell_clicked")]]
    # 此处写点击后要执行的逻辑,比如取点击的行号、列号、单元格值
    # 运行str(click_detail) 可查看返回的完整字段信息
  },
  # 建议加上该参数,初始化时不会空触发,只有真实点击才执行逻辑
  ignoreNULL = TRUE
)

如果是在R6类、Shiny模块中封装逻辑,也可以提前把动态事件名存为变量,让代码更整洁:

# 提前拼接事件名
dt_click_event <- paste0(self$name, "_cell_clicked")

shiny::observeEvent(
  input[[dt_click_event]],
  {
    # 业务逻辑
  }
)

替换写法后即可正常动态监听任意变量存储ID的DT表点击事件,不会再触发对象找不到的报错。

内容的提问来源于stack exchange,提问作者R. Gore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:51:17