以固定的时间间隔更新图形/绘图

Posted

技术标签:

【中文标题】以固定的时间间隔更新图形/绘图【英文标题】:Update graph/plot with fixed interval of time 【发布时间】:2013-08-20 14:06:01 【问题描述】:

我在 Shiny UI 中有一个情节。如果我更改任何输入参数并且通过反应性图将会改变。但是让我们考虑以下情况:- Shiny UI 中的绘图可以说股票的日内价格变动。为此,您查询一些实时数据源。现在,如果我创建一个刷新按钮,然后如果时间过去了,我会继续单击刷新按钮。随着时间进入该实时数据源,该图将随着新数据的到来而更新。 现在我的问题是我不想一直点击刷新按钮。但是我想用计时器运行一个循环,以便它检查固定的时间间隔,并且一旦有新数据出现,绘图就会自动更新。某种随着时间不断更新的 Google 财务图表。

所以问题可以简化如下:- 让我们考虑一下 Shiny 本身的这个例子:- ui.R

library(shiny)    

shinyUI(pageWithSidebar(    

  headerPanel("Hello Shiny!"),

  sidebarPanel(
    sliderInput("obs", 
                "Number of observations:", 
                min = 1,
                max = 1000, 
                value = 500)
  ),

  mainPanel(
    plotOutput("distPlot")
  )
))

和服务器.R

library(shiny)

shinyServer(function(input, output) 

  output$distPlot <- renderPlot(

    # generate an rnorm distribution and plot it
    dist <- rnorm(input$obs)
    hist(dist)
  )

)

现在我想在没有任何输入活动的情况下从正态分布生成不同的随机样本。所以基本上我想打电话

dist <- rnorm(input$obs)
hist(dist)

再次不改变sliderInput。 请帮我看看如何做到这一点。

【问题讨论】:

您可以使用reactiveTimer。见?reactiveTimer 我想你在找invalidateLater 是的,invalidateLater 和 reactiveTimer 都符合我的目的。唯一的问题是 invalidateLater 必须在响应式环境中实现,而 reactiveTimer 是创建响应式源 [只是为了澄清而重复事实]。我是 R Shiny 的新手,所以我花了很长时间。 【参考方案1】:

例如,您可以在本地运行以下命令:

library(shiny)

runApp(list(
  ui = pageWithSidebar(    

  headerPanel("Hello Shiny!"),

  sidebarPanel(
    sliderInput("obs", 
                "Number of observations:", 
                min = 1,
                max = 1000, 
                value = 500)
  ),

  mainPanel(
    plotOutput("distPlot")
  )
),
  server =function(input, output, session) 
    autoInvalidate <- reactiveTimer(5000, session)
    output$distPlot <- renderPlot(
      autoInvalidate()
      # generate an rnorm distribution and plot it
      dist <- rnorm(input$obs)
      hist(dist)
    )

  
))

每 5 秒会生成一个不同的正常样本

【讨论】:

非常感谢这将完成这项工作。但我想它会刷新整个会话。但它完成了这项工作。我想我得到了我想要的东西。 我有同样的问题,这正是我需要的答案。谢谢!【参考方案2】:

这也可以使用reactivePoll 来解决。代码要简单得多。它还有一个优点是您可以使用检查功能,该功能不一定会使反应式表达式无效,因为时间已经过去了。通过这种方式,您可以编写资源需求较少的代码。

然而,该示例仅使用Sys.tim() 作为检查函数。由于Sys.time() 每次调用都会不同,所以检查函数总是表示需要更新。

library(shiny)

runApp(list(
  ui = pageWithSidebar(

    headerPanel("Hello Shiny!"),

    sidebarPanel(
      sliderInput("obs",
                  "Number of observations:",
                  min = 1,
                  max = 1000,
                  value = 500)
    ),

    mainPanel(
      plotOutput("distPlot")
    )
  ),
  server = function(input, output, session) 
    dist <- reactivePoll(5000, session, function () Sys.time(), function () 
      rnorm(input$obs)
    )

    output$distPlot <- renderPlot(
      hist( req(dist()) )
    )
  
))

【讨论】:

以上是关于以固定的时间间隔更新图形/绘图的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 以固定间隔自动更新数据的后台传输服务

以固定的时间间隔执行for循环,例如。每5秒获取一次图[重复]

在MATLAB里如何改变生成图形的坐标间隔

MPAndroidChart:如何以固定间隔设置 x 轴标签

如何使用 Qt/QwtPlot 设置固定轴间隔?

如何在绘图图中整齐地或以一定间隔的形式显示 X 轴日期刻度