如何在Golem Shiny应用中正确使用其他包的内部数据?
你的当前方法存在问题,更稳健的方案如下
当前做法的问题
把data.rda放在Shiny包的R/文件夹并通过相对路径加载,不符合R包的结构规范,而且在包安装后会出现路径失效的问题:开发阶段的R/文件夹在包安装后会被编译处理,原始的data.rda不会保留在该路径下,导致应用运行时找不到数据文件。
推荐的解决方案
方案1:直接依赖数据准备包(最推荐)
如果数据准备包是你维护的,直接让它把预处理后的数据集作为内部数据导出,Shiny包通过依赖关系直接调用:
- 在数据准备包中运行:
usethis::use_data(your_preprocessed_data, internal = TRUE) - 在Shiny包的
DESCRIPTION文件中添加对数据准备包的依赖:Imports: 数据准备包名 - 在Shiny应用的代码中直接调用数据:
数据准备包名::your_preprocessed_data
这种方式完全符合R包的设计规范,无需手动复制或加载数据,还能保证数据版本和预处理逻辑的一致性。
方案2:将外部数据放入inst/extdata目录(无依赖场景)
如果不想让Shiny包依赖数据准备包,可将data.rda放到Shiny包的inst/extdata/目录下(如果没有这个目录就新建),然后通过system.file()获取正确路径加载:
- 把
data.rda移动到inst/extdata/ - 在
R/Load_data.R中修改加载代码:load_data <- function() { data_path <- system.file("extdata", "data.rda", package = "你的Shiny包名") load(data_path, envir = parent.frame()) } load_data()
system.file()会自动适配开发和安装后的路径,确保数据文件能被正确找到。
关于Shiny包自身的内部数据
你原本用usethis::use_data(internal_obj, internal = TRUE)管理的包内内部数据,继续保持即可——它会被打包到R/sysdata.rda中,和外部导入的data.rda互不干扰。
内容的提问来源于stack exchange,提问作者Grasshopper_NZ
相关产品推荐
相关产品推荐

