gpt4 book ai didi

r - 有没有办法在 Shiny 中构建时显示绘图,而不是等待所有绘图?

转载 作者:行者123 更新时间:2023-12-01 23:13:22 27 4
gpt4 key购买 nike

我有一个 Shiny 的仪表板,其中有很多图,所有这些都需要几秒钟才能构建。一旦最后一个构建完成,它们就会全部显示。我希望每个图在完成后立即显示。我知道 R 是单线程的,但似乎必须有一种方法“将执行返回到显示代码”或类似的东西。

此代码演示了该问题:

library(shiny)

ui <- fluidPage(
title = "Page loading test"
, h1("Page loading test")
, plotOutput("plot1")
, plotOutput("plot2")
, plotOutput("plot3")
, plotOutput("plot4")
)

server <- function(input, output) {
output$plot1 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})

output$plot2 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})

output$plot3 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})

output$plot4 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
}

shinyApp(ui = ui, server = server)

sleep 只是为了模拟缓慢的执行。

页面显示需要 40 秒。我希望页面花 10 秒来显示plot1,然后再花 10 秒来显示plot2,等等。是否有像 UpdatePage() 这样的调用可以在每个绘图函数的底部调用?

在我的页面上,我运行了加载动画,以便用户知道正在发生事件,这使得它们在立即加载时更加明显。

当然,我可以有一个更简单的页面,但那样它就不是仪表板了。 :)

最佳答案

您可以使用reactiveTimer()定期刷新页面。

您可以将绘图保存在绘图列表中,以便在每次刷新时立即打印它们。

我必须重新排序 renderPlot 函数,以便 step 迭代器一次只渲染一个图

此外,我选择不立即开始第一次渲染来绘制“加载”图。

library(shiny)

ui <- fluidPage(
title = "Page loading test"
, h1("Page loading test")
, plotOutput("plot1")
, plotOutput("plot2")
, plotOutput("plot3")
, plotOutput("plot4")
)

# Loading plot
plot(-1:1, -1:1, type = "n", xlab = "", ylab = "")
text(0,0, "Loading",cex = 5)
loading <- recordPlot()

plotlist <- vector("list",4)
step <- 0 # which plot should be rendered next

server <- function(input, output, session) {
autoInvalidate <- reactiveTimer(10, session)
output$plot4 <- renderPlot({autoInvalidate();
if(step>4){plotlist[[4]]}
else if(step==4){step <<- step+1
print("rendering step 4")
Sys.sleep(10)
plotlist[[4]] <<- {plot(rnorm(50));recordPlot()}} else loading
})
output$plot3 <- renderPlot({autoInvalidate();
if(step>3){plotlist[[3]]}
else if(step==3){step <<- step+1
print("rendering step 3")
Sys.sleep(10)
plotlist[[3]] <<- {plot(rnorm(50));recordPlot()}} else loading
})
output$plot2 <- renderPlot({autoInvalidate();
if(step>2){plotlist[[2]]}
else if(step==2){step <<- step+1
print("rendering step 2")
Sys.sleep(10)
plotlist[[2]] <<- {plot(rnorm(50));recordPlot()}} else loading
})
output$plot1 <- renderPlot({autoInvalidate();
if(step>1){plotlist[[1]]}
else if(step==1){step <<- step+1
print("rendering step 1")
Sys.sleep(10)
plotlist[[1]] <<- {plot(rnorm(50));recordPlot()}} else {step <<-1;loading}
})
}
shinyApp(ui = ui, server = server)

关于r - 有没有办法在 Shiny 中构建时显示绘图,而不是等待所有绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40531345/

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