r - هل هناك طريقة لعرض المؤامرات لأنها بناء في لامعة بدلا من انتظار كل منهم؟



shiny plotly (1)

يمكنك استخدام reactiveTimer() لتحديث صفحتك بانتظام.

ويمكنك حفظ المؤامرات الخاصة بك في list المؤامرات لطباعتها على الفور في كل تحديث.

كان لي لإعادة ترتيب وظائف 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 هو واحد مترابطة، ولكن يبدو كما لو أنه يجب أن يكون هناك وسيلة "إعادة التنفيذ إلى رمز العرض" أو شيء من هذا القبيل.

توضح هذه الشفرة المشكلة:

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 ثانية. أود أن تأخذ الصفحة 10 ثانية لعرض plot1، ثم 10s إضافية لعرض plot2، وما إلى ذلك هل هناك مكالمة مثل أوبداتيباج () التي يمكن استدعاؤها في أسفل كل وظيفة مؤامرة؟

على صفحتي، لقد تحميل الرسوم المتحركة تشغيل حتى المستخدم هو علم النشاط يحدث، الأمر الذي يجعلها أكثر وضوحا عندما يتم تحميلها في وقت واحد.

يمكنني بالطبع أن يكون صفحة أبسط، ولكن بعد ذلك لن يكون لوحة القيادة. :)