2

感谢rhandonstable,我要求我的shinyApp 的用户填写一张表格,从中完成计算并实时显示图表。这很棒!但是,由于计算时间的原因(Sys.sleep()在下面的 MRE 中进行了一点模拟),渲染的handsontable时间可能比用户填充的时间要长。这使其不稳定并触发一些奇怪的循环。通过在下面的示例中填充第一列(使用整数),然后“非常突然”地填充第二列,可以看到这种效果。如果不够突然,只需增加Sys.sleep()时间,让这种效果更明显。这种效果似乎很不重要,但是一旦应用程序在 shinyapps.io 上,它就几乎无法使用。

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

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)
4

0 回答 0