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

Golem Shiny应用中如何加载可同时用于UI和服务器的最新数据?

在Golem框架中加载共享最新数据的可行方案

以下是几种既能保证数据最新,又能让UI和Server同时访问的落地方法:

方法1:全局脚本加载(类似传统Shiny的app.R顶部逻辑)

在Golem项目的R/目录下新建data_loader.R文件,定义数据加载函数并执行,将数据存入全局环境:

# R/data_loader.R
load_latest_data <- function() {
  # 替换为你的开放数据加载逻辑
  data <- read.csv("https://your-open-data-url.csv")
  return(data)
}

# 执行函数,数据存入全局环境
global_app_data <- load_latest_data()

之后在app_ui.R和app_server.R中直接引用global_app_data即可。数据会在应用启动时加载一次,保证启动时为最新状态,适合不需要运行中实时刷新的场景。

方法2:利用Golem启动钩子加载

通过Golem的启动钩子在应用初始化时加载数据,存入全局环境:

# R/app_config.R
golem::set_golem_options()

.onAttach <- function(libname, pkgname) {
  # 加载数据并写入全局环境
  assign("global_app_data", load_latest_data(), envir = .GlobalEnv)
}

或者直接在项目入口的app.R中加载:

# app.R
pkgload::load_all(export_all = FALSE, helpers = FALSE)
options("golem.app.prod" = TRUE)

# 启动时加载最新数据
global_app_data <- load_latest_data()

golem::run_app()

两种方式都能让UI和Server直接访问global_app_data。

方法3:存入Golem全局配置(推荐)

使用Golem自带的配置管理功能存储数据,避免污染全局环境:

# R/data_loader.R
load_latest_data <- function() {
  data <- read.csv("https://your-open-data-url.csv")
  # 将数据存入Golem全局配置
  golem::set_golem_options("app_data" = data)
}

然后在应用启动时调用该函数(比如app.R中):

# app.R
pkgload::load_all(export_all = FALSE, helpers = FALSE)
options("golem.app.prod" = TRUE)

load_latest_data()
golem::run_app()

之后在UI和Server中通过统一接口获取数据:

# UI中生成匹配数据的选项
selectInput("category", "选择分类", choices = unique(golem::get_golem_options("app_data")$category))

# Server中使用数据
server <- function(input, output, session) {
  app_data <- golem::get_golem_options("app_data")
  output$data_table <- renderTable(app_data)
}

方法4:运行时定时刷新(需高频更新场景)

如果需要应用运行期间自动更新数据,结合reactivePoll实现定时刷新,并同步到UI:

# Server中实现定时刷新
server <- function(input, output, session) {
  # 每小时检查并更新一次数据
  app_data <- reactivePoll(
    intervalMillis = 3600000,
    session = session,
    checkFunc = function() {
      # 检查数据是否更新的逻辑,比如获取数据最后修改时间
      httr::HEAD("https://your-open-data-url.csv")$headers$`last-modified`
    },
    valueFunc = function() {
      load_latest_data()
    }
  )
  
  # 将更新后的选项同步到UI
  observe({
    session$sendCustomMessage(
      type = "updateCategoryChoices",
      message = list(choices = unique(app_data()$category))
    )
  })
  
  # Server中使用最新数据
  output$data_table <- renderTable(app_data())
}

# UI中添加JS监听消息更新选项
tags$script(HTML("
  Shiny.addCustomMessageHandler('updateCategoryChoices', function(msg) {
    const select = document.getElementById('category');
    select.innerHTML = '';
    msg.choices.forEach(choice => {
      const option = document.createElement('option');
      option.value = choice;
      option.textContent = choice;
      select.appendChild(option);
    });
  });
"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:15:35