2016-11-10 1 views
4

많은 플롯이있는 반짝이는 대시 보드가 있으며,이 모든 플롯에는 빌드하는데 몇 초가 걸립니다. 마지막 하나가 빌드되면 모두 표시됩니다. 완료 되 자마자 각 줄거리가 표시되기를 바랍니다. 나는 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) 

잠이 느린 실행을 에뮬레이트하는 단지입니다

이 코드는 문제를 보여줍니다.

페이지를 표시하는 데 40 초가 소요됩니다. 나는 plot1을 표시하기 위해 10 초가 걸린 다음 plot2를 표시하기 위해 10 초가 걸리게하고 싶습니다. 각 Plot 함수의 맨 아래에서 호출 할 수있는 UpdatePage()와 같은 호출이 있습니까?

내 페이지에서 사용자가 액티비티가 발생하고 있음을 알 수 있도록 애니메이션이로드되어있어 한 번에로드 할 때 훨씬 더 분명합니다.

물론 더 간단한 페이지를 만들 수도 있지만 대시 보드가 아닙니다. :)

답변

1

reactiveTimer()을 사용하면 정기적으로 페이지를 새로 고칠 수 있습니다.

플롯을 list 플롯에 저장하면 새로 고침 할 때마다 즉시 인쇄 할 수 있습니다.

은 내가 step 반복자는 내가 먼저 "로드"플롯을 플롯 바로 렌더링을 시작하지 않기로 시간 또한

에 하나의 플롯을 렌더링 할 수 있도록 renderPlot 순서 바꾸기 기능을 사용했다.

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)