20

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

所以问题可以简化如下:-让我们从 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)

再次不更改滑块输入。请帮我找出如何做到这一点。

4

2 回答 2

23

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

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 秒将生成一个不同的正常样本

于 2013-08-18T19:46:49.337 回答
0

这也可以使用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()) )
    })
  }
))
于 2021-02-07T16:43:21.393 回答