r - 使用选项卡和 suspendWhenHidden = FALSE 优化 Shiny 性能

标签 r shiny

我有一个基于 Flexdashboard 的 Shiny 应用程序,它有几个选项卡,在每个选项卡中,有多个绘图的网格。性能有点问题,尤其是在免费的 Shiny Server 上部署时。

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

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

总之,一个混合的 suspendWhenHidden = FALSE 和 TRUE:

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

这是一个最小的可重现示例。目标是让第一个绘图(在选项卡 1 中)在开始渲染第二个绘图(在选项卡 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)

最佳答案

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

  • 加载所有选项卡,然后显示输出
  • 使用 eventReactive 激活其他选项卡

  • 对于第一个选项,只需在下面添加
    outputOptions(output, "plot1", suspendWhenHidden = FALSE)
    
    如果你想要 react 性写 eventReactive每个选项卡的功能。

    关于r - 使用选项卡和 suspendWhenHidden = FALSE 优化 Shiny 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50684756/

    相关文章:

    r - R 中的重音不敏感正则表达式

    r - 在ggplot2中分别标准化多面直方图

    shiny - R Shiny radioButtons 如何改变一些选择的颜色?

    r - 更改 Shiny 中的默认错误消息

    r - 无法通过 R-Shiny 显示 Leaflet HTML(404 错误)。如何将 KML 文件与 rMaps 或 leaflet-shiny 集成?

    r - 如何根据条件提取列名?

    R计算矩阵/数组部分的sd

    R Shiny 将图片添加到带有文本的流体行中的框中

    css - 将背景图像添加到 Shiny NavBarPage

    r - 如何重置 react 值?