【问题标题】:How to fetch data from REST API periodically?如何定期从 REST API 获取数据?
【发布时间】:2021-05-27 15:04:18
【问题描述】:

背景

我目前正在构建一个“Data-Logger” - 使用 R Shiny 的应用程序。我确实有一个 REST - API,它返回一个随时间变化的值。我的目标是创建一个闪亮的应用程序,其中用户可以单击一个操作按钮开始定期(例如每 60 秒)将从 api 获取的值写入数据帧。当用户单击另一个操作按钮时,也应该停止记录数据。

问题

我的问题是编写一个函数,该函数在按下按钮时开始执行,之后定期执行,并在按下另一个按钮时停止执行。

以前的想法

我之前尝试过使用 invalidateLater(),但我无法实现我想要的。

你们能帮我出个聪明的主意吗?

提前致谢!

【问题讨论】:

  • 注意这个数据记录标签不是你要找的数据记录标签 [挥手] en.wikipedia.org/wiki/Datalog

标签: r api shiny reactive


【解决方案1】:

这应该显示它是如何工作的。 invalidateLater() 是正确的选择。开始/停止按钮更改确定轮询是打开还是关闭的反应表达式。这样一来,响应式RestPoll 表达式在每次打开/关闭时都会收到通知,当然,只要Running() == TRUE 在 500 毫秒之后。

library(shiny)

ui <- fluidPage(
  actionButton("btnStart", "Start"),
  actionButton("btnStop", "Stop"),
  textOutput("outTime")
)

server <- function(input, output, session) {
  Running <- reactiveVal(FALSE) 
  
  observeEvent(input$btnStart, {
    Running(TRUE)
  })

  observeEvent(input$btnStop, {
    Running(FALSE)
  })
  
  RestPoll <- reactive({
    if (Running()) # IS called every time `Running` changes
      invalidateLater(500, session)
    
    # Add any REST calls here, process the results
    
    return(Sys.time()) # deliver results
  })
  
  output$outTime <- renderText({
    req(RestPoll())
  })
}

shinyApp(ui, server)

您也可以使用 reactiveTimer 来执行此操作,但在不需要轮询时也会轮询和使用资源。

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多