R Shiny中renderTable生成表格后下载CSV报内部服务器错误求助
解决Shiny中downloadHandler下载CSV的内部服务器错误
我帮你定位到问题啦!你代码里的核心错误是直接把output$table传给了write.csv——output$table是Shiny生成的输出对象,并不是你实际的data.frame数据,服务器没法处理这个对象,所以才抛出了Internal Server Error。
咱们只需要把要展示和下载的数据单独抽出来,用reactive()表达式存起来,让渲染表格和下载功能共享同一份原始数据就行。修正后的完整代码如下:
library(shiny) # Define UI for data download app ---- ui <- fluidPage( # App title ---- titlePanel("Downloading Data"), # Sidebar layout with input and output definitions ---- sidebarLayout( # Sidebar panel for inputs ---- sidebarPanel( # Button downloadButton("downloadData", "Download") ), # Main panel for displaying outputs ---- mainPanel( tableOutput("table") ) ) ) # Define server logic to display and download selected file ---- server <- function(input, output) { # 用reactive存储共享数据,既给表格渲染用,也给下载用 data_to_use <- reactive({ data.frame(a = c(1,2,3), b = c("q","s","f")) }) # Table of selected dataset ---- output$table <- renderTable({ data_to_use() # 调用reactive数据 }) # Downloadable csv of selected dataset ---- output$downloadData <- downloadHandler( filename = function() { paste("test.csv") }, content = function(file) { write.csv(data_to_use(), file, row.names = FALSE) # 这里同样调用原始数据 } ) } shinyApp(ui,server)
关键修改点说明:
- 新增了
data_to_use <- reactive({...}):把你的数据框放在这个响应式表达式里,作为整个服务器逻辑里的共享数据源 renderTable中改用data_to_use()获取数据,确保表格展示的是原始数据downloadHandler的content函数里,同样调用data_to_use(),把真实的data.frame传给write.csv,这样就能正常生成CSV文件了
内容的提问来源于stack exchange,提问作者Gompu
相关产品推荐
相关产品推荐

