在下面的 MRE 中,要求用户填写一个绘制曲线的表格。为了模拟一些计算,在生成图形输出之前发生在表上,我添加了一个Sys.sleep()
. 您将看到,如果表格填充得足够快,即比 快,Sys.sleep()
应用程序将变得不可用并且必须被终止。
我相信这是因为表格渲染是在计算/睡眠和绘图渲染之后发生的。我应该如何解决这个问题以使应用程序实时反应并且仍然可用?
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 <- {
Sys.sleep(.4)
values[["DF"]]
}
ggplot(data=table) + geom_line(aes(x=x, y=y))
})
})
shinyApp(ui=ui, server=server)