如何在通过模板创建RStudio项目的过程中运行Shiny应用
问题原因
- RStudio项目模板的创建函数默认运行在非交互式后台会话中,会话会禁用交互式UI调用,且不会自动打印返回值
- 你编写的
run_app()仅返回Shiny应用对象,普通交互式环境下返回值会被自动打印触发应用启动,但模板函数中无自动打印逻辑,因此仅生成了应用对象但未实际运行 - 后台会话默认覆盖
launch.browser参数,即使配置了也不会主动拉起浏览器
解决方法
第一步:修改模板配置文件
找到你包路径下inst/rstudio/templates/project/中对应的.dcf模板配置文件,新增一行配置声明当前模板为交互式模式:
Interactive: TRUE
完整的.dcf示例如下:
Template: 自定义项目模板 Description: 带Shiny配置流程的自定义RStudio项目模板 Interactive: TRUE Open: TRUE
第二步:修改代码显式触发Shiny运行
修改run_app()函数,不再仅返回Shiny应用对象,而是显式调用shiny::runApp()启动应用:
run_app <- function() { ui <- shiny::fluidPage(shiny::titlePanel("New Project")) server <- function(input, output, session) { session$onSessionEnded(function() { shiny::stopApp() }) } app <- shiny::shinyApp(ui = ui, server = server) # 显式启动应用,阻塞当前流程直到应用关闭 shiny::runApp( app, # 强制拉起系统默认浏览器 launch.browser = getOption("shiny.launch.browser", interactive()) ) } hello_world <- function(path, ...) { # 先创建项目根目录 dir.create(path, recursive = TRUE, showWarnings = FALSE) # 调用应用,此时流程会阻塞,直到用户关闭Shiny页面后继续执行后续项目初始化逻辑 run_app() # 以下为原有项目初始化逻辑,比如生成配置文件、示例代码等 writeLines("# 自定义项目", file.path(path, "README.md")) }
注意事项
- 若需要通过Shiny收集用户配置来生成项目文件,可在Shiny的
stopApp()中返回收集到的参数,在hello_world()中接收后再执行对应文件生成逻辑 - 若不需要保留Shiny运行产生的临时变量,可在应用关闭后手动清理工作空间
内容的提问来源于stack exchange,提问作者the-mad-statter
相关产品推荐
相关产品推荐

