R Shiny实现每5秒更新ping结果的响应式gauge仪表盘方案
实现方案
你现有代码的ping逻辑写在server函数顶层,仅会在Shiny应用启动时执行1次,所以gauge只会展示首次ping的结果。要实现定时更新,直接使用Shiny原生的reactiveTimer即可,不需要自己写循环逻辑避免阻塞响应线程。
修改后的完整server代码
#Server functions #======================================================================= server <- shinyServer(function(input, output, session) { # 定义5秒触发一次的定时器,参数单位为毫秒 auto_refresh <- reactiveTimer(5000) # 定义响应式表达式,每次定时器触发时自动重新执行ping操作 ping_results <- reactive({ auto_refresh() # 此处可扩展多台服务器的ping逻辑,保留你原有示例不变 list( careware = ping_port("google.com")[1], ksyos = 26 # 原有对照值,需要更新的话替换为对应服务器的ping逻辑即可 ) }) output$out1 <- flexdashboard::renderGauge({ current_ping <- ping_results()$careware gauge(current_ping, min = 0, max = 250, symbol = 'ms', label = "Verbinding Careware",gaugeSectors( success = c(250, 150), warning = c(150,50), danger = c(0, 50), colors = c("#CC6699") )) }) output$out2 <- flexdashboard::renderGauge({ current_ping <- ping_results()$ksyos gauge(current_ping, min = 0, max = 250, symbol = 'ms', label = "Verbinding Ksyos",gaugeSectors( success = c(100, 6), warning = c(5,1), danger = c(0, 1), colors = c("#CC6699") )) }) })
多服务器批量适配优化
如果后续需要新增更多服务器gauge,不需要重复写renderGauge代码,可通过批量生成简化逻辑:
- 先定义服务器映射列表:
server_list <- c("google.com" = "Careware", "baidu.com" = "Ksyos", "yourserver.com" = "业务服务器") - 用lapply批量生成输出:
lapply(seq_along(server_list), function(i){ output[[paste0("out", i)]] <- flexdashboard::renderGauge({ auto_refresh() current_ping <- ping_port(names(server_list)[i])[1] gauge(current_ping, min = 0, max = 250, symbol = 'ms', label = paste0("Verbinding ", server_list[i]), gaugeSectors(success = c(250, 150), warning = c(150,50), danger = c(0, 50), colors = c("#CC6699")) ) }) })
注意事项
你原有代码中server函数结束的})后多了一个多余的},运行前请删除避免语法报错。
内容的提问来源于stack exchange,提问作者Raptor-ZH
相关产品推荐
相关产品推荐

