点击ActionButton启动第二个Shiny应用时报错:app.R did not return a shiny.appobj object
我来帮你分析这个问题的根源,以及对应的解决办法:
问题核心原因
你当前的script.R里用shiny::runApp()直接运行shinyML_classification.R脚本,但这个脚本其实是shinyML包中shinyML_classification()函数的源码文件——它只是定义了函数逻辑,并没有直接返回一个Shiny应用对象(也就是缺少shinyApp(ui, server)这类返回语句)。而runApp()要求目标文件/目录必须能输出shiny.appobj类型的对象,这就是报错的关键所在。
具体解决步骤
1. 修正script.R的内容
把原本通过runApp()调用函数源码的方式,改成直接调用shinyML_classification()函数(这个函数本身就是用来启动对应Shiny应用的封装入口)。修改后的script.R如下:
# 显式加载所需依赖包(Job是独立会话,无法复用主应用的环境) library(shiny) library(shinyML) # 直接调用包内函数启动第二个Shiny应用 shinyML_classification(data = iris, y = "Species", framework = "h2o")
2. 确认路径与权限
- 检查
rstudioapi::jobRunScript()中的path参数是否是script.R的正确绝对路径,避免因路径拼写错误导致脚本无法执行。 - 确保当前用户对
script.R所在目录有读写权限,防止Job执行时出现权限问题。
3. 测试调整后的流程
运行第一个Shiny应用后,点击「Launch second Shiny App」按钮,此时RStudio会启动一个独立的Job会话执行script.R,进而调用shinyML_classification()函数启动第二个应用,两个应用会在各自的会话中运行,不会互相干扰。
额外提示
如果未来你要运行自己编写的自定义Shiny应用脚本,那脚本必须包含完整的UI、Server定义,并且最后要有shinyApp(ui, server)的返回语句,这样runApp()才能识别并启动它。但在这个场景下,因为你用的是shinyML包提供的封装函数,直接调用函数才是最正确的方式。
备注:内容来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

