如何解决R Shiny使用invalidateLater()时的应用闪烁问题
解决Shiny DT数据表高频刷新闪烁问题的方案
Joe Cheng提供的
.recalculating透明度修改规则仅对Shiny原生输出组件生效,DT、Leaflet这类HTML Widget组件的重绘逻辑是销毁原有DOM实例后重建新实例,因此仅修改透明度无法阻止闪烁。
最优方案:使用DT代理增量更新数据
该方案完全避免重绘整个DT实例,仅替换表格数据,无任何闪烁,同时还能保留用户设置的排序、筛选、分页等操作状态,性能消耗也远低于全量重绘。
完整实现代码如下:
library(DT) library(shiny) ui <- fluidPage( h2("The mtcars data"), DT::dataTableOutput("mytable") ) server <- function(input, output, session) { # 首次渲染仅执行一次 output$mytable = DT::renderDataTable({ mtcars }) # 初始化DT代理 dt_proxy <- dataTableProxy("mytable") # 每秒拉取数据并更新,不重建表格实例 observe({ invalidateLater(1000) # 此处替换为你的数据库拉取逻辑 latest_data <- mtcars # 仅替换表格数据,resetPaging设为FALSE可保留当前分页状态 replaceData(dt_proxy, latest_data, resetPaging = FALSE) }) } shinyApp(ui, server)
备选方案:CSS隐藏重绘过程(适配必须全量重绘的场景)
如果业务逻辑要求必须每次全量重绘DT表格,可以添加以下CSS规则降低闪烁感知:
tags$style(type="text/css", " .dt-container.recalculating { opacity: 1 !important; transition: none !important; visibility: hidden; } .dt-container:not(.recalculating) { visibility: visible; } ")
该方案可消除明显的闪烁动画,但仍会有轻微的内容切换感知,仅推荐在无法使用DT代理的场景下使用。
内容的提问来源于stack exchange,提问作者Santhosh Manikandan
相关产品推荐
相关产品推荐

