3

我正在尝试自动化 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())))
                }
    })
    }
))
4

1 回答 1

1

您收到错误是因为hist分布是在 if 子句中定义的,但是您在子句中使用它(在 5 个间隔之后)else,它没有定义。这就是为什么它适用于前 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中找到代码的工作版本。

于 2013-09-05T19:34:56.240 回答