如何在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
相关产品推荐
相关产品推荐

