自动与R Shiny App交互

时间:2013-09-04 19:23:32

标签: r shiny googlevis

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

1 个答案:

答案 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>