优先使用handsontable渲染闪亮的渲染

时间:2018-07-23 14:29:45

标签: r shiny handsontable rhandsontable

由于rhandonstable,我要让我的ShinyApp的用户填写一个表格,通过该表格可以完成计算并实时显示绘图。这很棒!但是,由于计算时间(在下面的MRE中由少许Sys.sleep()模拟),handsontable的呈现可能比用户填充花费的时间更长。这使其不稳定并触发一些奇怪的循环。通过在下面的示例中填充第一列(使用整数),然后“突然填充”第二列,可以看到这种效果。如果不够突然,请增加Sys.sleep()时间以使这种效果更加明显。这种效果看似无关紧要,但是一旦将应用程序安装在shinyapps.io上,它几乎就无法使用。

好吧,我非常确定自己做错了,因为我对reactiveobserverisolate的理解非常有限。但是为了避免这种影响(并且不得不要求用户保持缓慢),我想优先考虑渲染,以便在不渲染表的情况下不会触发任何计算并更新图。保持实时方面也很重要,因此我想避免使用“计算”​​按钮。有人可以解释我该怎么做吗?任何其他建议都将非常受欢迎。

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 个答案:

没有答案