如何让Shiny先读取首个文件后再启动应用?
解决方案
要实现Shiny先读取file_1.xlsx再启动应用,同时仅在用户选择对应选项时加载另外两个文件,可按以下方式修改代码:
核心思路
- 应用启动前(全局环境)仅读取并处理
file_1.xlsx,保证应用启动前完成该文件加载 - 另外两个文件延迟加载:在用户选择
File2或File3时,再读取对应文件并处理 - 初始状态默认显示
file_1的图表,无需等待用户操作
修改后的完整代码
library(shiny) library(tidyverse) library(readxl) # 补充加载readxl包,否则read_xlsx无法运行 # 应用启动前先读取并处理file_1,这一步会在应用启动前完成 file_1 <- read_xlsx('www/data/file_1.xlsx') %>% mutate(new_column = 'time series') ui <- fluidPage( selectInput(inputId = 'choices', label = "文件选择", choices = c('File1','File2','File3'), selected = 'File1'), # 默认选中第一个文件,初始显示对应图表 plotOutput('chart') ) server <- function(input, output, session) { # 响应选择事件,延迟加载File2和File3 selected_data <- reactive({ switch(input$choices, 'File1' = file_1, 'File2' = { # 选择File2时才读取并处理该文件 read_xlsx('www/data/file_2.xlsx') %>% mutate(new_column = 'time series') }, 'File3' = { # 选择File3时才读取并处理该文件 read_xlsx('www/data/file_3.xlsx') %>% mutate(new_column = 'time series') }) }) # 根据选中的数据渲染图表 output$chart <- renderPlot({ ggplot(selected_data(), aes(x=x, y=y)) + geom_line(color = switch(input$choices, 'File1' = 'blue', 'File2' = 'green', 'File3' = 'red')) }) } shinyApp(ui, server)
关键修改说明
- 全局仅加载file_1:把
file_1的读取放在全局环境,应用启动前会先完成这个操作,满足“先读取首个文件再启动应用”的需求 - 延迟加载其他文件:通过
reactive对象,只有当用户选择File2或File3时才读取对应文件,减少应用启动时的资源消耗 - 修正原代码笔误:原代码中
file_2_new和file_3_new错误使用file_1进行处理,现在改为对应文件的处理逻辑 - 简化逻辑:用
switch替代嵌套if判断,代码更简洁易读 - 默认选中初始文件:给
selectInput设置selected = 'File1',应用启动后直接显示file_1的图表
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

