Shiny应用如何创建动态tabBox并解决gt表格不更新问题
问题根因
你遇到的表格重复问题是Shiny惰性求值的经典场景,错误出在局部变量的引用上:你已经在local块内把循环变量i赋值给了局部变量my_i,但render_gt中调用数据集时仍然使用了全局的循环变量i。等到所有render_gt真正触发执行时,全局的i已经走到了循环的最终值,所以所有标签页都会渲染最后一份数据集对应的表格。
修复方案
只需要修改render_gt内的数据集索引即可,把mylist()[[i]]替换为mylist()[[my_i]]。
修正后的核心代码片段
for (i in 1:length(mylist())){ local({ my_i <- i tablename <- paste("table", my_i, sep = "") output[[tablename]] <- render_gt({ # 把原来的i改为局部变量my_i mylist()[[my_i]] %>% gt() }) }) }
补充优化建议
- 可以在
observeEvent触发时先清空旧的output,避免旧输出残留导致冲突:observeEvent(mylist(), { # 先清空旧的表格输出 output_options <- names(output) %>% str_subset("^table\\d+$") walk(output_options, ~output[[.x]] <- NULL) # 后面接原有renderUI和循环渲染逻辑 }) - 给
tabBox设置固定的id,方便后续监听当前激活的标签页,便于扩展功能。
内容的提问来源于stack exchange,提问作者mdb_ftl
相关产品推荐
相关产品推荐

