由于rhandonstable
,我要让我的ShinyApp的用户填写一个表格,通过该表格可以完成计算并实时显示绘图。这很棒!但是,由于计算时间(在下面的MRE中由少许Sys.sleep()
模拟),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)