Shiny Dashboard切换标签时保持fileInput已加载文件的问题
解决Shiny标签页切换后fileInput文件丢失问题
问题出在每次切换标签时,你通过renderUI重新生成了新的fileInput组件,原有组件被销毁,导致上传的文件状态丢失。正确的做法是将两组输入组件预先定义在UI中,通过条件判断控制显示/隐藏,而非动态重建组件。
修改后的完整代码如下:
library(shiny) library(shinydashboard) library(shinyWidgets) library(readxl) ui <- dashboardPage( dashboardHeader(title = "Pricing model"), dashboardSidebar( # Amazon-HP 对应的输入组件,仅在选中该标签时显示 conditionalPanel( condition = "input.tabs == 'Amazon-HP'", fileInput("file1", "Choose an Excel file for Amazon-HP"), uiOutput("var1") ), # Apple Desktop 对应的输入组件,仅在选中该标签时显示 conditionalPanel( condition = "input.tabs == 'Apple Desktop'", fileInput("file2", "Choose an Excel file for Apple Desktop"), uiOutput("var2") ) ), dashboardBody( tabsetPanel( id = "tabs", tabPanel("Amazon-HP"), tabPanel("Apple Desktop") ) ) ) server <- function(input, output, session) { # 存储两个标签页的文件数据 fileData <- reactiveValues(file1 = NULL, file2 = NULL) # 读取Amazon-HP的上传文件 data1 <- reactive({ req(fileData$file1) readxl::read_excel(fileData$file1$datapath) }) # 读取Apple Desktop的上传文件 data2 <- reactive({ req(fileData$file2) readxl::read_excel(fileData$file2$datapath) }) # 渲染Amazon-HP的变量选择器 output$var1 <- renderUI({ req(data1()) pickerInput( inputId = "s1", label = "Select variables", choices = colnames(data1())[-c(1, 2)], selected = colnames(data1())[-c(1, 2)], multiple = TRUE, options = list( `actions-box` = TRUE, `deselect-all-text` = "None", `select-all-text` = "All !", `none-selected-text` = "zero" ) ) }) # 渲染Apple Desktop的变量选择器 output$var2 <- renderUI({ req(data2()) pickerInput( inputId = "s2", label = "Select variables", choices = colnames(data2())[-c(1, 2)], selected = colnames(data2())[-c(1, 2)], multiple = TRUE, options = list( `actions-box` = TRUE, `deselect-all-text` = "None", `select-all-text` = "All !", `none-selected-text` = "zero" ) ) }) # 监听file1的上传变化,更新存储的文件数据 observeEvent(input$file1, { fileData$file1 <- input$file1 }) # 监听file2的上传变化,更新存储的文件数据 observeEvent(input$file2, { fileData$file2 <- input$file2 }) } shinyApp(ui, server)
关键修改说明
- UI结构调整:使用
conditionalPanel替代动态渲染,两组输入组件始终存在于DOM中,只是根据当前标签页显示/隐藏,避免组件重建导致的状态丢失。 - 拆分变量选择器的UI输出:将原来的
var拆分为var1和var2,分别对应两个标签页的变量选择器,确保各自独立渲染。 - 移除动态渲染逻辑:删除server中监听标签切换来渲染fileInput和var的observe代码,因为组件现在由条件面板控制显示。
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

