renderHighcharts 与 renderUI;渲染多个图时哪个更快

renderHighcharts vs renderUI; Which one is faster when rendering several plots

我正在构建一个应用程序,该应用程序有时会在网格布局中呈现 7-16 个 Highcharts。 这些 Highcharts 的渲染速度很慢,我正在努力让它更快。

现在我正在使用 renderUI()、htmlOutput() 和 highcharter::hw_grid() 来渲染图形。 (见代码块 1) 我遇到了这个 Post 他们试图通过首先使用 highcharter::renderHighchart() 渲染图形然后在 renderUI() 函数中使用 highcharter::higchartOutput() 来提高性能。我稍微更改了代码,使其输出与我的第一个版本相同,但想法应该保持不变。(参见代码块 2)

我现在已经在两个闪亮的应用程序中实现了这两个版本,并尝试使用 profvis 对其进行评估。我对 profvis 很陌生,我不确定在哪里可以比较这两个选项。所以我刚刚查看了 RunApp() 花费的总时间。我使用 renderUI() 和 htmlOutput() 的第一个版本似乎比第二个版本更快。这与前面提到的 Post.

的结果相矛盾

现在我想知道哪个选项更快,为什么。我是否应该将我的代码从版本 1 更改为版本 2 以提高性能?

代码块 1


samp <- sample(5000, 100, replace = TRUE)
library("highcharter")
library(shiny)

ui <- shinyUI(fluidPage(
    htmlOutput('plots')
))



server <- shinyServer(function(input, output) {
    

    
    output$plots <- renderUI({
        
        output=list()
        for (i in 1:50) {
            n <- i # Make local variable
            plotname <- paste("plot", n , sep="")
            
            output[[plotname]] <- 
                highchart() %>%
                hc_chart(type = "column") %>%
                hc_title(text = "renderHighchart()") %>%
                hc_xAxis(categories = seq_along(samp)) %>%
                hc_add_series(
                    data = samp,
                    name = "Downloads"
                )
        }
        hw_grid(output,ncol=3)
    })
})

app=shinyApp(ui=ui,server=server)

profvis::profvis(runApp(app))

代码块 2

samp <- sample(5000, 100, replace = TRUE)
library("highcharter")
library(shiny)


ui <- shinyUI(fluidPage(
    uiOutput('plots')
))


server <- shinyServer(function(input, output) {
    
    n.col <- 3
    
    output$plots <- renderUI({
        col.width <- round(12/n.col) # Calculate bootstrap column width
        n.row <- ceiling(50/n.col) # calculate number of rows
        cnter <<- 0 # Counter variable
        
        # Create row with columns
        rows  <- lapply(1:n.row,function(row.num){
            cols  <- lapply(1:n.col, function(i) {
                cnter    <<- cnter + 1
                plotname <- paste("plot", cnter, sep="")
                column(col.width, highchartOutput(plotname))
            }) 
            fluidRow( do.call(tagList, cols) )
        })
        
        do.call(tagList, rows)
    })
    
    for (i in 1:50) {
        local({
            n <- i # Make local variable
            plotname <- paste("plot", n , sep="")
            output[[plotname]] <- renderHighchart({
                highchart() %>%
                    hc_chart(type = "column") %>%
                    hc_title(text = "renderHighchart()") %>%
                    hc_xAxis(categories = seq_along(samp)) %>%
                    hc_add_series(
                        data = samp,
                        name = "Downloads"
                    )
            })
        })
    }
})

app=shinyApp(ui=ui,server=server)

profvis::profvis(runApp(app))

我现在已经将两个选项放在一个应用程序中

samp <- sample(5000, 100, replace = TRUE)
library("highcharter")
library(shiny)


ui <- shinyUI(
    fluidPage(
    fluidRow(uiOutput('plots')),
    fluidRow(htmlOutput('rUI')))
)


server <- shinyServer(function(input, output) {
    
    n.col <- 3
    
    output$plots <- renderUI({
        col.width <- round(12/n.col) # Calculate bootstrap column width
        n.row <- ceiling(50/n.col) # calculate number of rows
        cnter <<- 0 # Counter variable
        
        # Create row with columns
        rows  <- lapply(1:n.row,function(row.num){
            cols  <- lapply(1:n.col, function(i) {
                cnter    <<- cnter + 1
                plotname <- paste("plot", cnter, sep="")
                column(col.width, highchartOutput(plotname))
            }) 
            fluidRow( do.call(tagList, cols) )
        })
        
        do.call(tagList, rows)
    })
    
    for (i in 1:50) {
        local({
            n <- i # Make local variable
            plotname <- paste("plot", n , sep="")
            output[[plotname]] <- renderHighchart({
                highchart() %>%
                    hc_chart(type = "column") %>%
                    hc_title(text = "renderHighchart()") %>%
                    hc_xAxis(categories = seq_along(samp)) %>%
                    hc_add_series(
                        data = samp,
                        name = "Downloads"
                    )
            })
        })
    }
    
    output$rUI <- renderUI({
        
        output=list()
        for (i in 1:50) {
            n <- i # Make local variable
            plotname <- paste("plot", n , sep="")
            
            output[[plotname]] <- 
                highchart() %>%
                hc_chart(type = "column") %>%
                hc_title(text = "renderUI") %>%
                hc_xAxis(categories = seq_along(samp)) %>%
                hc_add_series(
                    data = samp,
                    name = "Downloads"
                )
        }
        hw_grid(output,ncol=3)
    })
})

app=shinyApp(ui=ui,server=server)

profvis::profvis(runApp(app))

如果我现在在 profvis 中查看 output$plotsoutput$rUi 的聚合时间,我可以看到 output$plots 的聚合时间确实更快