gpt4 book ai didi

在 Shiny 的应用程序中异步渲染绘图

转载 作者:行者123 更新时间:2023-12-03 08:54:22 25 4
gpt4 key购买 nike

在 Shiny 的应用程序中,我一次渲染几个绘图,但它们仅在计算完所有绘图后才渲染。例如,如果渲染 9 个绘图中的第 8 个需要 8 秒,而渲染第 9 个绘图需要 15 秒,则前 8 个绘图将仅在第 9 个绘图渲染后出现(在 15 秒而不是 8 秒之后)。请参阅下面的示例。

box_plot1 仅在渲染 box_plot2 时出现。我玩了一下 Shiny 的 promise ,但到目前为止还没有找到解决方案。

MWE:

library(shinydashboard)
library(plotly)

header <- dashboardHeader(
title = ""
)

body <- dashboardBody(
fluidRow(
column(width = 6,
box(width = NULL, solidHeader = TRUE,
plotly::plotlyOutput("box_plot1")
)
),
column(width = 6,
box(width = NULL, solidHeader = TRUE,
plotly::plotlyOutput("box_plot2")
)
)
)
)

ui <- dashboardPage(
header,
dashboardSidebar(disable = TRUE),
body
)

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

output$box_plot1 <- plotly::renderPlotly({
p <- plot_ly(ggplot2::diamonds, x = ~cut, y = ~price, color = ~clarity, type = "box") %>%
layout(boxmode = "group")

p
})

output$box_plot2 <- plotly::renderPlotly({

for (i in 1:3) {
print(i)
Sys.sleep(1)
}

plot_ly(ggplot2::diamonds, y = ~price, color = ~cut, type = "box")
})
}

shinyApp(ui = ui, server = server)

最佳答案

@DSGym 的答案可以显示一个又一个的图,但这仍然不能异步运行。事实上,如果你有一个需要很长时间来渲染的图或者一个需要很长时间来计算的数据帧,我们需要异步执行这些操作。作为一个例子,考虑这个没有异步支持的常规 Shiny 应用程序,

library(shinydashboard)
library(plotly)
library(future)
library(promises)

plan(multisession)

header <- dashboardHeader(
title = ""
)

body <- dashboardBody(
fluidRow(
column(width = 6,
box(width = NULL, solidHeader = TRUE,
plotly::plotlyOutput("box_plot1")
)
),
column(width = 6,
box(width = NULL, solidHeader = TRUE,
plotly::plotlyOutput("box_plot2")
)
)
)
)

ui <- dashboardPage(
header,
dashboardSidebar(disable = TRUE),
body
)

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

output$box_plot1 <- plotly::renderPlotly({

for (i in 1:10) {
print(i)
Sys.sleep(1)
}

plot_ly(ggplot2::diamonds, x = ~cut, y = ~price, color = ~clarity, type = "box") %>%
layout(boxmode = "group")
})

output$box_plot2 <- plotly::renderPlotly({


for (i in 11:20) {
print(i)
Sys.sleep(1)
}

plot_ly(ggplot2::diamonds, y = ~price, color = ~cut, type = "box")


})
}

shinyApp(ui = ui, server = server)

每个图计数到 10 并显示其输出。从执行 runApp() 开始,整个操作需要 20 多秒才能完成。

为了异步调用这两个图,我们使用 futures 和 Promise 包。

library(shinydashboard)
library(plotly)
library(future)
library(promises)

plan(multisession)

header <- dashboardHeader(
title = ""
)

body <- dashboardBody(
fluidRow(
column(width = 6,
box(width = NULL, solidHeader = TRUE,
plotly::plotlyOutput("box_plot1")
)
),
column(width = 6,
box(width = NULL, solidHeader = TRUE,
plotly::plotlyOutput("box_plot2")
)
)
)
)

ui <- dashboardPage(
header,
dashboardSidebar(disable = TRUE),
body
)

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

output$box_plot1 <- plotly::renderPlotly({
future({
for (i in 1:10) {
print(i)
Sys.sleep(1)
}

plot_ly(ggplot2::diamonds, x = ~cut, y = ~price, color = ~clarity, type = "box") %>%
layout(boxmode = "group")
})
})

output$box_plot2 <- plotly::renderPlotly({

future({
for (i in 11:20) {
print(i)
Sys.sleep(1)
}

plot_ly(ggplot2::diamonds, y = ~price, color = ~cut, type = "box")
})

})
}

shinyApp(ui = ui, server = server)

现在,即使两个图都计数到 10,图还是异步执行的。加载绘图的总时间减少到 20 秒以下。

但是,两个图仍然一起加载。这是因为 Shiny 的固有冲洗周期。因此,即使我们异步执行绘图,所有绘图也将始终同时加载。

您可以在这里阅读更多相关信息:https://rstudio.github.io/promises/articles/shiny.html

关于在 Shiny 的应用程序中异步渲染绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com