调用runApp()时出现“C stack usage 15924224 is too close to the limit”错误的原因及解决方法
解决Shiny应用
runApp(".")启动时的C栈溢出问题 问题原因分析
你遇到的C stack usage ... is too close to the limit错误,核心原因是无限递归调用:
- 你的脚本里同时写了
shinyApp(ui = ui, server = server)和runApp(".")两个启动语句,而且这个脚本应该是命名为app.R放在当前工作目录下的。 - 当你执行
runApp(".")时,Shiny会自动加载当前目录下的app.R脚本;而脚本里的runApp(".")又会再次触发加载app.R,形成无限循环,不断消耗栈内存,最终触发C栈溢出。 - 而直接执行
shinyApp(ui = ui, server = server)时,是直接调用已经定义好的ui和server对象,不会触发递归加载,所以能正常启动。
对应的解决办法
1. 移除重复的启动语句(最关键)
你只需要保留一种启动方式即可:
- 如果习惯直接运行脚本启动:删除
runApp("."),只保留shinyApp(ui = ui, server = server),运行脚本就能启动应用。 - 如果想用
runApp(".")启动:删除脚本里的shinyApp(ui = ui, server = server)和runApp("."),只保留ui和server的定义(runApp(".")会自动读取app.R里的ui和server对象来启动应用)。
2. 规范文件结构(可选优化)
- 确保你的应用脚本命名为
app.R,并且放在你执行runApp(".")的当前工作目录下。 - 另外,你的代码里图片用了绝对路径
C:/Users/asus/Desktop/App-1/rstudio.png,这种方式在不同环境下可能失效。建议在应用目录下创建www子目录,把图片放进去,然后用img(src="rstudio.png", height=70, width=200)调用,这是Shiny应用加载静态资源的标准方式。
3. 临时调整栈限制(仅作为最后手段)
如果是其他递归场景导致的栈溢出(而非本次的重复启动语句问题),可以临时调整R的栈限制,但不推荐作为首要方案:
# 在启动应用前执行,提高表达式栈上限 options(expressions = 500000)
注意:这个方法可能带来稳定性问题,优先解决代码里的递归逻辑问题才是根本。
小提示
你的代码里还有个小笔误:div("install packages('shiny')", style="color:red")应该改成div("install.packages('shiny')", style="color:red")(正确的包安装函数是install.packages)。
内容的提问来源于stack exchange,提问作者user19562955
相关产品推荐
相关产品推荐

