Расставить приоритеты в рендеринге с блеском

Благодаря rhandonstable, Я прошу пользователя моего блестящего приложения заполнить таблицу, из которой сделаны вычисления и графики отображаются в режиме реального времени. Это замечательно! Тем не менее, из-за времени вычислений (моделируется немного Sys.sleep() в MRE ниже), рендеринг handsontable может занять больше времени, чем его заполнение пользователем. Это делает его нестабильным и вызывает некоторые странные циклы. Этот эффект можно увидеть, заполнив первый столбец (целыми числами) в приведенном ниже примере, а затем "совершенно неожиданно" заполнив второй столбец. Если не достаточно внезапно, просто увеличьте Sys.sleep() время сделать этот эффект более очевидным. Этот эффект может показаться очень незначительным, но как только приложение находится на shinyapps.io, оно делает его практически непригодным для использования.

Ну, я уверен, что я делаю что-то не так, как мое понимание reactive, observer а также isolate очень ограничен. Но чтобы избежать этого эффекта (и необходимости просить пользователя быть медленным), я бы хотел расставить приоритеты при рендеринге, чтобы никакие вычисления не запускались и график не обновлялся, пока таблица не отображается. Также важно сохранять аспект в реальном времени, поэтому я бы хотел избежать использования кнопки "вычислить". Может ли кто-нибудь объяснить мне, как это сделать? Любое другое предложение будет приветствоваться.

library(shiny)
library(rhandsontable)
library(ggplot2)

DF <- data.frame(x=integer(0), y=integer(0))

ui <- shinyUI(fluidPage(

                        mainPanel( 
                          rHandsontableOutput("hot"),
                          plotOutput("plot1")
                        )
))

server <- shinyServer(function(input, output) {

  values <- reactiveValues()

  observe({
    if (!is.null(input$hot)) {
      DF <- hot_to_r(input$hot)
    } else {
      if (is.null(values[["DF"]]))
        DF <- DF
      else
        DF <- values[["DF"]]
    }
    values[["DF"]] <- DF
  })

  output$hot <- renderRHandsontable({
    rhandsontable(values[["DF"]], stretchH = "all", minRows=5)
  })

  output$plot1 <- renderPlot({
      table <- values[["DF"]]
      table <- na.omit(table)

      Sys.sleep(.3) # 

      ggplot(data=table) + geom_line(aes(x=x, y=y))

    })

})

shinyApp(ui=ui, server=server)

0 ответов

Другие вопросы по тегам