Shiny App部署至shinyapps.io多次刷新后报Not Found错误原因
问题说明
将.Rmd文件上传部署到shinyapps.io平台后,初始阶段(前5次刷新页面时)应用可正常运行,预期运行效果见对应截图。但对URL执行超过5次刷新操作后,页面原本展示表格的位置会出现Not Found错误提示;两次刷新间隔期间未修改任何应用代码,也未更新任何应用相关内容。

异常触发原因
- 平台实例生命周期与临时存储机制限制:shinyapps.io免费/基础档位的应用实例有固定存活时长、并发调度阈值,短时间连续刷新会触发实例轮换,旧实例被销毁时,其挂载的临时存储目录会被完全清空。如果表格是先渲染为静态文件存到临时目录再嵌入页面,旧实例销毁后对应文件路径直接失效,就会返回
Not Found,连续5次刷新刚好达到免费套餐默认的实例重启触发阈值。 - Runtime配置不匹配:如果.Rmd的YAML头中配置的是
runtime: shiny,每次页面刷新都会触发全文档重新渲染,免费套餐默认仅分配1个worker处理请求,连续刷新产生的渲染请求会快速打满worker队列,超时未处理的资源请求会直接返回不存在错误。 - 写入路径权限问题:如果代码中用相对路径
./写入生成的表格文件,shinyapps.io默认文件系统为只读状态,非系统指定可写目录下的文件会在实例重置时被直接清除,刷新触发实例重置后文件丢失,就会报找不到的错误。
修复方法
- 优先使用Shiny原生动态输出组件渲染表格,比如
renderTable、reactable::renderReactable搭配对应Output函数,直接在会话实时渲染内容,不依赖磁盘存储的静态文件,从根源避免文件丢失问题。 - 若必须生成静态文件嵌入,统一将文件输出路径设置为
tempdir()目录下,且在Rmd的初始化setup代码块中提前完成路径创建,不要跨会话复用历史生成的文件路径。 - 登录shinyapps.io控制台调整对应应用的配置:根据访问需求调整worker数量,付费档位可开启实例保活设置,降低短时间刷新触发的实例轮换频率。
- 将.Rmd的YAML头中的runtime配置修改为
runtime: shiny_prerendered,提前渲染文档静态部分,仅将动态交互逻辑放到服务端运行,降低单次刷新的资源开销,减少worker队列堵塞概率。
内容的提问来源于stack exchange,提问作者CheckThis
相关产品推荐
相关产品推荐

