如何部署依赖私有GitHub R包foo中函数的在线Shiny应用?
解决方案
针对你提到的托管在GitHub上的R包foo中内嵌Shiny应用、部署时无法依赖包内函数的问题,有以下几种可行方案:
方案1:在Shiny应用中自动安装并加载包
在Shiny应用的入口文件(比如app.R)开头添加代码,让部署环境自动从GitHub安装foo包并加载:
# 检查并安装devtools(用于从GitHub安装包) if (!requireNamespace("devtools", quietly = TRUE)) { install.packages("devtools") } # 安装并加载foo包 if (!requireNamespace("foo", quietly = TRUE)) { devtools::install_github("你的GitHub用户名/foo") } library(foo)
- 优势:无需修改包结构,部署环境会自动拉取完整包资源,应用可直接调用
R/文件夹内的所有函数。 - 注意:部署环境需要能够访问GitHub,首次部署会安装包,后续重新部署时会同步包的最新版本。
方案2:显式引用包函数+部署前预安装包
- 在Shiny应用代码中,所有调用包内函数的地方都用
foo::函数名的形式(比如foo::my_custom_function()),避免依赖library(foo)的隐式加载。 - 在部署环境中预先安装
foo包:- 如果用Shiny Server:在服务器上执行
devtools::install_github("你的GitHub用户名/foo"),或者在应用的启动脚本中添加该命令。 - 如果用Posit Connect:在部署设置中添加"安装脚本",执行上述安装命令。
- 如果用Shiny Server:在服务器上执行
方案3:将Shiny应用封装为包的导出函数
这是最符合R包规范的方案:
- 在
R/文件夹下新增一个函数,用于启动内嵌的Shiny应用:
run_foo_app <- function() { # 获取内嵌Shiny应用的路径 app_path <- system.file("app", package = "foo") if (app_path == "") { stop("未找到Shiny应用,请确认foo包安装正确", call. = FALSE) } # 启动应用 shiny::runApp(app_path) }
- 在包的
NAMESPACE文件中导出该函数(或者用roxygen2注释#' @export)。 - 部署时,只需在启动脚本中执行
foo::run_foo_app()即可。
- 优势:完全遵循R包的结构设计,应用与包的依赖关系清晰,部署时只需确保
foo包已安装即可。
内容的提问来源于stack exchange,提问作者Filippo Gambarota
相关产品推荐
相关产品推荐

