R Блестящая анимация Scatterplot Скорость исполнения - PullRequest
1 голос
/ 11 апреля 2019

Я хочу сделать анимацию в 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 итерацийанимация становится очень медленной.Я думаю, что основная проблема заключается в том, что, поскольку в моем коде мне приходится заново создавать график на каждой итерации, есть ли более плавный способ сделать то, что я хочу сделать?

(Не обязательно сТочно, но для меня важно, чтобы я отслеживал количество итераций вне графика (здесь rv $ i))

...