我正在尝试自动化Shiny应用程序的交互,因此它会在递增预定范围的输入时显示一系列结果,而不必重复计算和更改输入值。这种自动化将提供一系列输入的系统视图,例如所选库存的更新价格图表的显示,或正在监控的实时过程的当前性能指标图。
这类似于问题[更新图表/具有固定时间间隔的图表](Update graph/plot with fixed interval of time),它使用计时器运行循环。扩展这种方法,我的目标是: a)自动将invalidateLater暂停设置为高(1小时),以便在固定(5)一组显示后有效地停止循环,等待新用户输入以重新启动它。
b)[当我能做到这一点时,我会添加一个基于计数器的控制来循环通过一组输入$ obs,然后停止。为简单起见,这里省略了具有相同错误和可能相同解决方案的步骤。]
使用上面提到的玩具示例,以下脚本会反复循环显示其5个显示,但它会产生此错误,而不是更改暂停间隔。
收听8100端口 hist.default出错(dist,main = paste(“Last Histogram count =”,as.numeric(updater()),: 'x'必须是数字
as.numeric(自动控制()) 错误:找不到函数“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())))
}
})
}
))
答案 0 :(得分:1)
您收到错误是因为hist
分布是在if子句中定义的,但是您在else
子句中使用它(在5个时间间隔之后),它没有定义。这就是为什么它适用于前5个区间。
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())))
}
在我将dist移到if
状态之前,我让你的骑车上班。 (我还将您的代码拆分为UI.R和server.R以使其更易于管理。)不粘贴在这里,因为它本质上是相同的代码,但您可以在此gist中找到代码的工作版本。 / p>