{golem}包应用启动时自动执行脚本导入动态数据集的问题咨询
Golem 应用启动自动执行数据拉取脚本的解决方案
首先明确默认设计逻辑:/data-raw目录下的脚本是Golem约定用于包构建阶段生成静态内置数据的工具脚本,不会在应用运行阶段自动触发,/data目录下的.rda文件是包构建时就固化的静态文件,因此不会自动更新。
你需要根据使用场景选择以下调整方案:
方案1:将数据逻辑迁移到启动执行流程(推荐,适配动态数据场景)
动态拉取的实时数据本身不适合用usethis::use_data存为静态内置数据,直接调整逻辑即可:
- 把原
data_prep.R中的数据拉取、清洗逻辑封装为独立函数,比如命名为get_latest_df(),存放在/R目录下(例如/R/utils_data.R) - 删除原脚本末尾的
usethis::use_data(df, overwrite = T)语句,函数直接返回处理完成的数据框 - 在应用启动入口注入数据加载逻辑:
- 若需要应用启动时才拉取数据,将调用逻辑放到
/R/run_app.R的run_app()函数最开头,示例代码:
run_app <- function(...) { # 启动时先拉取最新数据 df <- get_latest_df() # 将数据赋值到应用全局环境 shiny::shinyOptions(app_data = df) golem::with_golem_options( app = shiny::shinyApp(ui = app_ui, server = app_server), golem_opts = list(...) ) }- 若需要包加载时就提前拉取数据,将调用逻辑写到
/R/zzz.R的.onLoad()钩子中:
.onLoad <- function(libname, pkgname) { df <<- get_latest_df() } - 若需要应用启动时才拉取数据,将调用逻辑放到
方案2:保留原data_prep.R脚本的临时方案
如果只是本地自用不需要打包发布,可以直接在启动逻辑中加脚本调用,但注意该方案在打包为安装包时会失效(因为/data-raw默认不会被打包进安装包):
# 加入run_app()开头 source(here::here("data-raw", "data_prep.R"))
注意事项
- 不要硬编码数据库账号密码,推荐用
config包或者系统环境变量存储敏感连接信息 - 若数据拉取耗时较长,可搭配
waiter包添加启动加载页提升用户体验,也可根据业务需求增加缓存逻辑,避免每次启动都重复拉取数据
内容的提问来源于stack exchange,提问作者Chris Mcnally
相关产品推荐
相关产品推荐

