如何让Shiny在未选中对应tabPanel时提前渲染图表?
解决Shiny标签页图表延迟加载的问题
要让Shiny提前渲染隐藏标签页里的图表,核心是关闭输出对象的「隐藏时挂起」特性,具体可以通过outputOptions()函数实现:
核心方法:设置suspendWhenHidden = FALSE
Shiny默认会对隐藏的输出对象(比如未选中的tabPanel里的plotOutput)暂停渲染来节省资源。你只需要在server函数里给每个图表输出添加outputOptions(output$xxx, suspendWhenHidden = FALSE),就能让它们在应用启动时就开始渲染,不管所在标签页是否被选中。
修改后的完整代码如下:
library(shiny) ui <- fluidPage( mainPanel( tabsetPanel( id = "tabset", tabPanel("panel 1", "this panel will show first"), tabPanel("show me the plots", "现在图表会在应用启动时提前渲染,切换标签页不会有延迟", plotOutput("plot1"), plotOutput("plot2"), plotOutput("plot3"), plotOutput("plot4") ) ) ) ) server <- function(input, output, session) { # 定义图表输出 output$plot1 <- renderPlot(res = 96,{plot(runif(10000),runif(10000))}) output$plot2 <- renderPlot(res = 96,{plot(cars)}) output$plot3 <- renderPlot(res = 96,{plot(runif(100000),runif(100000))}) output$plot4 <- renderPlot(res = 96,{plot(runif(300000),runif(300000))}) # 关闭隐藏时挂起,强制提前渲染所有图表 outputOptions(output$plot1, suspendWhenHidden = FALSE) outputOptions(output$plot2, suspendWhenHidden = FALSE) outputOptions(output$plot3, suspendWhenHidden = FALSE) outputOptions(output$plot4, suspendWhenHidden = FALSE) } shinyApp(ui, server)
额外优化建议
如果图表数据量极大,除了提前渲染,还可以用renderCachedPlot()替代renderPlot(),它会缓存渲染结果,进一步提升切换速度。用法和renderPlot()基本一致:
output$plot3 <- renderCachedPlot(res = 96,{ plot(runif(100000),runif(100000)) }, cacheKeyExpr = {}) # 无动态参数时,cacheKeyExpr设为空表达式即可
内容的提问来源于stack exchange,提问作者user2589499
相关产品推荐
相关产品推荐

