r语言 - 使用选项卡和挂起时隐藏优化闪亮性能 = FALSE



我有一个基于 Flexdashboard 的 Shiny 应用程序,其中包含多个选项卡,每个选项卡内有多个绘图的网格。性能是一个问题,特别是当部署在免费的Shiny服务器上时。

最初,主要问题是单击每个选项卡需要重新渲染绘图。我将 suspendWhenHidden 选项设置为 FALSE,这很有帮助 - 现在切换输入加载所有绘图的延迟很慢,但至少在导航 UI 时,性能是敏捷的。

然而,这让我思考 - 有没有办法实现这两种行为的混合?所以说我在一个活动选项卡上,它只产生一个情节。此图渲染速度很快。我们可以告诉 shiny 渲染这个图,显示给用户,然后在后台继续加载其他选项卡的所有元素吗?就目前而言,在隐藏选项卡上的所有图也呈现之前,活动选项卡不会完成渲染绘图。

总之,混合挂起WhenHidden = FALSE 和 TRUE:

首先呈现活动选项卡元素,显示给用户,然后 继续渲染隐藏选项卡上的元素 我想也许设置优先级可能会实现这一目标,但它似乎不起作用。有什么想法或建议吗?

下面是一个最小的可重现示例。目标是在开始渲染第二个绘图(在选项卡 2 中(之前渲染并显示第一个绘图(在选项卡 2 中( - 但绘图应在选项卡 2 中开始渲染,而无需单击选项卡 2。

library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput('n', 'Size', 10)
),
mainPanel(
tabsetPanel(
tabPanel("Tab1", plotOutput("plot1")),
tabPanel("Tab2", plotOutput("plot2"))))
)
)
# Define the server code
server <- shinyServer(function(input, output, session) {
output$plot1 <- renderPlot({plot(1:input$n)},height = 400,width=800)
output$plot2 <- renderPlot({ Sys.sleep(5); plot(1:input$n,col="red")},height = 400,width=800)
outputOptions(output, "plot2", suspendWhenHidden = FALSE) 
})
# Return a Shiny app object
shinyApp(ui = ui, server = server)

有两种方法可以实现这一点

  1. 加载所有选项卡,然后显示输出
  2. 使用事件反应激活其他选项卡

对于第一个选项,只需在下面另外放置

outputOptions(output, "plot1", suspendWhenHidden = FALSE)

如果你想要反应性,为每个选项卡写eventReactive函数。

最新更新