嵌入RMarkdown的Shiny应用部署成功后超时显示‘NOT FOUND’
问题分析与解决方案
核心问题
部署在shinyapps.io上的flexdashboard嵌入式Shiny应用,静态内容正常,但运行约1分钟后断开并显示NOT FOUND错误,重启仅临时恢复,调整超时设置无效。
代码问题排查
从提供的Shiny代码来看,存在以下关键错误:
- 未正确加载数据:全局环境中调用
df$name生成下拉选项,但注释了df <- read.fst(...)的加载代码;服务器端使用df3 <- by_owner,但by_owner未定义。这类未捕获的变量缺失错误会导致shinyapps.io强制终止应用进程。 - 性能隐患:使用
tableOutput渲染大型数据表,会一次性加载所有数据,极易触发内存不足,导致进程被杀死。
修复方案
1. 修正数据加载与渲染逻辑
调整代码,确保数据正确加载,并改用更高效的表格组件:
library(shiny) library(dplyr) library(fst) library(DT) ui <- fillPage( # 初始化空下拉,后续动态填充选项 selectInput("filter", "Filter by Fuel Treatment:", choices = character(0)), # 用DT组件实现虚拟滚动,降低内存占用 div(style="height: 900px; overflow-y: auto", DT::dataTableOutput("filtered_data")) ) server <- function(input, output, session) { # 在服务器端加载数据,避免全局环境依赖 df <- read.fst("data/fst_files/fuel_treatment_subset.fst") # 补充by_owner的实际定义,示例假设为df的衍生表 df3 <- df %>% mutate(owner = "示例所有者") # 根据实际逻辑修改 # 动态更新下拉选项 updateSelectInput(session, "filter", choices = unique(df$name)) # 响应式过滤数据 filtered_data <- reactive({ df3 %>% filter(name %in% input$filter) }) # 渲染表格,启用虚拟滚动 output$filtered_data <- DT::renderDataTable({ filtered_data() }, options = list(scrollY = "850px", paging = FALSE, scrollCollapse = TRUE)) } shinyApp(ui, server)
2. 优化shinyapps.io资源配置
- 检查应用内存使用:若接近套餐上限(如免费套餐1GB),需缩小数据集,仅加载必要列,例如
read.fst("xxx.fst", select = c("name", "必要列1", "必要列2")) - 调整应用设置:确保实例数≥1,将空闲超时时间设为套餐最大值(免费套餐为15分钟)
- 若内存持续不足,考虑升级到更高套餐获取更多资源
3. 本地验证与部署
- 本地运行修改后的代码,确认无报错、表格加载正常
- 重新部署后,监控shinyapps.io应用面板的内存与CPU使用情况,确认是否仍出现断开问题
内容的提问来源于stack exchange,提问作者VCollier
相关产品推荐
相关产品推荐

