R Shiny动画散点图速度表现

时间:2019-04-11 03:17:29

标签: r animation shiny plotly

我想在R Shiny中制作一个动画,其中我的散布图在每次迭代时都会逐渐更新,这是我当前的图

library(shiny)
library(plotly)

ui <- fluidPage(
   titlePanel(""),
   sidebarLayout(
      sidebarPanel(
        actionButton("launch", "Launch Simulation"),
        radioButtons("display","Show every iteration", selected = 10,
                     choices = c(1,5,10,50),inline = FALSE),
        numericInput("iter","Maximum number of iterations", value = 2000,
                     min = 500,max = 5000, step = 500)
      ),
      mainPanel(
        plotlyOutput('plot')
      )
   )
)

server <- function(input, output) {

  rv <- reactiveValues(i = 0,
                          df = data.frame(x = -1,y = -1))

  observeEvent(input$launch,{
    rv$i = 0
    rv$df = data.frame(x = runif(5000, min = -1,max = 1),
                       y = runif(5000, min = -1,max = 1))
  })

  observe({
    isolate({
      rv$i = rv$i + as.numeric(input$display)
    })

    if ((rv$i < input$iter)&input$launch){
      invalidateLater(0)
    }
  })

  output$plot <- renderPlotly({
    df = data.frame(x = 0,y = -1)
    df = rbind(df,rv$df)

    plot_ly(df[1:(rv$i + 1),], x = ~x, y = ~y,
            type = 'scatter', mode = 'markers', 
            marker = list(size = 4), hoverinfo="none") %>%
      layout(showlegend = FALSE)
  })

}

shinyApp(ui = ui, server = server)

代码在开始时运行良好,但是经过大约1000次迭代后,动画变得非常慢。我认为主要的问题在于,因为在我的代码中,我必须在每次迭代时重新制作整个图,是否有一种更平滑的方法来完成我想做的事情?

(不一定要使用Plotly,但对我来说重要的是,我要跟踪绘图外部的迭代次数(此处为rv $ i))

0 个答案:

没有答案