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
相关产品推荐
相关产品推荐

