我正在尝试自动化 Shiny 应用程序的交互,以便它显示一系列结果,同时通过预定的输入范围递增,而不必重复计算和更改输入值。这种自动化将提供一组输入的系统视图,例如显示选定股票的刷新价格图表,或正在监控的实时流程的当前绩效指标图。
这类似于问题 [Update graph/plot with fixed interval of time](Update graph/plot with fixed interval of time),它使用计时器运行循环。扩展该方法,我的目标是: a) 自动将 invalidateLater 暂停设置为高(1 小时),以在固定 (5) 组显示后有效地停止循环,等待新的用户输入以重新启动它。
b) [当我可以做到这一点时,我将添加一个基于计数器的控件,以便在它停止之前循环通过一组 input$obs。为简单起见,此处省略了具有相同错误和可能相同解决方案的该步骤。]
使用上面引用的玩具示例,以下脚本会重复循环显示其 5 次显示,但它会产生此错误,而不是更改暂停间隔。
在 hist.default(dist, main = paste("Last Histogram count =", as.numeric(updater()), : 'x' must be numeric
as.numeric(autoControl()) 错误:找不到函数“autoControl”
我找不到该任务所需的反应导体、反应值或其他方法。谢谢您的帮助。
library(shiny)
updates <- 0
updater <- function(){ updates + 1 }
runApp(list(
ui = pageWithSidebar(
headerPanel("Hello Shiny!"),
sidebarPanel(
sliderInput("obs",
"Number of observations:",
min = 1,
max = 1000,
value = 50)
,
selectInput(inputId = "secPause",
label = "Seconds between displays:",
choices = c(1, 2, 3, 60*60),
selected = 2)
),
mainPanel(
plotOutput("distPlot")
)
),
server =function(input, output, session) {
updateTracker <- reactive( {
invalidateLater(as.numeric(input$secPause) * 1000, session)
updates <<- as.numeric(updater())
})
autoControl <- reactive( {
if(updateTracker() <= 5)
secPause <<- input$secPause
else
secPause <<- 60*60
return(secPause)
})
output$distPlot <- renderPlot( {
if(updateTracker() <= 5) {
# generate an rnorm distribution and plot it
dist <- rnorm(input$obs)
hist(dist, main = paste("Histogram count =" , updateTracker()))
}
else {
updates <<- 0
hist(dist, main = paste("Last Histogram count =",
as.numeric(updater()), "with secPause =",
as.numeric(autoControl())))
}
})
}
))