libreria - ¿Hay alguna manera de mostrar las tramas a medida que se construyen en Shiny en lugar de esperar a todas?
plotly software (1)
Puede usar reactiveTimer()
para actualizar su página regularmente.
Y puede guardar sus parcelas en una list
de parcelas para imprimirlas inmediatamente en cada actualización.
Tuve que reordenar las funciones renderPlot
para que el iterador de step
solo renderice un gráfico a la vez
También elegí no comenzar el primer render de inmediato para trazar parcelas de "Carga".
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)
Tengo un Shiny Dashboard con muchas tramas, todas las cuales tardan varios segundos en construirse. Una vez que construye el último, todos se muestran. En su lugar, me gustaría que cada gráfico se muestre tan pronto como se complete. Entiendo que R tiene un único subproceso, pero parece que debe haber una forma de "devolver la ejecución al código de visualización" o algo así.
Este código demuestra el problema:
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)
Los sueños son simplemente para emular la ejecución lenta.
Se necesitan 40 segundos para que se muestre la página. Me gustaría que la página tome 10s para mostrar plot1, luego 10s adicionales para mostrar plot2, etc. ¿Hay una llamada como UpdatePage () que se pueda llamar al final de cada función de trazado?
En mi página, tengo cargando animaciones en ejecución para que el usuario sepa que la actividad está ocurriendo, lo que lo hace aún más obvio cuando se cargan a la vez.
Podría, por supuesto, tener una página más simple, pero no sería un tablero. :)