You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shiny中实现表格每小时自动更新或点击刷新按钮手动更新

问题解决方法

你的现有代码将invalidateLater()放在了仅监听刷新按钮点击的observeEvent()中,导致定时更新逻辑只有点击按钮后才会触发,无法独立运行,两种更新逻辑没有解耦,修改后可正常实现需求的代码如下:

library(shiny)
library(jsonlite)

if (interactive()) {
  shinyApp(
    ui = fluidPage(
      fluidRow(
        column(12,
               tableOutput('table'),
               actionButton("refresh", "Update")
        )
      )
    ),
    server = function(input, output) {
      # 响应式数据:点击按钮或每15秒都会触发重新拉取数据
      reactive_spot_prices <- reactive({
        # 同时监听两个触发条件:按钮点击、定时失效
        input$refresh
        invalidateLater(15000)
        
        # 仅请求一次API,解析所有贵金属价格
        spot_data <- fromJSON("https://api.metals.live/v1/spot")
        spot_gold <- spot_data[[1]][[1]]
        spot_silver <- spot_data[[2]][[1]]
        spot_platinum <- spot_data[[3]][[1]]
        spot_palladium <- spot_data[[4]][[1]]
        cbind(spot_gold, spot_silver, spot_platinum, spot_palladium)
      })
      
      # 表格渲染依赖响应式数据,数据更新自动重绘
      output$table <- renderTable({
        reactive_spot_prices()
      })
    }
  )
}

核心修改逻辑

  • 将数据拉取逻辑封装为独立的响应式变量,它同时响应两类触发信号:一是用户点击刷新按钮的动作,二是每15秒触发的定时失效信号,任意信号触发都会重新拉取最新接口数据
  • 表格渲染逻辑仅依赖这个响应式价格变量,只要数据更新就会自动重绘表格,符合Shiny的响应式编程规范
  • 优化了重复API请求的问题,仅调用一次接口就解析所有贵金属价格,减少不必要的网络请求

内容的提问来源于stack exchange,提问作者Luke Robins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:24:09