感谢rhandonstable
,我要求我的shinyApp 的用户填写一张表格,从中完成计算并实时显示图表。这很棒!但是,由于计算时间的原因(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)