如何在R Shiny中对两个上传文件运行R脚本并下载新数据框
R Shiny上传双文件、处理合并并导出Excel完整示例
以下是满足你需求的完整可运行示例,包含文件上传、数据处理、合并及Excel导出的全流程:
依赖包
首先确保安装所需包:
install.packages(c("shiny", "openxlsx", "readxl"))
完整代码
library(shiny) library(openxlsx) library(readxl) # 自定义数据处理函数(可替换为你的R脚本逻辑) process_and_merge_data <- function(df1, df2) { # 示例处理逻辑:按共同列合并,这里假设两数据框有"id"列作为关联键 merged_df <- merge(df1, df2, by = "id", all = TRUE) # 这里可以添加你的其他处理步骤,比如数据清洗、计算等 merged_df$new_column <- merged_df$value1 + merged_df$value2 return(merged_df) } ui <- fluidPage( titlePanel("双文件上传处理导出工具"), sidebarLayout( sidebarPanel( # 第一个文件上传控件 fileInput("file1", "上传第一个数据集", accept = c(".csv", ".xlsx", ".xls")), # 第二个文件上传控件 fileInput("file2", "上传第二个数据集", accept = c(".csv", ".xlsx", ".xls")), # 下载按钮(仅当两个文件都上传后可用) downloadButton("download_merged", "导出合并后Excel"), width = 3 ), mainPanel( # 可选:预览合并后的数据 tableOutput("preview_table") ) ) ) server <- function(input, output, session) { # 读取第一个上传的文件 df1 <- reactive({ req(input$file1) file_ext <- tools::file_ext(input$file1$name) if(file_ext == "csv"){ read.csv(input$file1$datapath) } else { read_excel(input$file1$datapath) } }) # 读取第二个上传的文件 df2 <- reactive({ req(input$file2) file_ext <- tools::file_ext(input$file2$name) if(file_ext == "csv"){ read.csv(input$file2$datapath) } else { read_excel(input$file2$datapath) } }) # 处理并合并数据 merged_data <- reactive({ req(df1(), df2()) process_and_merge_data(df1(), df2()) }) # 预览合并后的数据 output$preview_table <- renderTable({ merged_data() }) # 下载处理逻辑 output$download_merged <- downloadHandler( filename = function() { paste0("merged_data_", Sys.Date(), ".xlsx") }, content = function(file) { write.xlsx(merged_data(), file) } ) # 禁用下载按钮直到两个文件都上传 observe({ toggleState("download_merged", condition = !is.null(input$file1) && !is.null(input$file2)) }) } shinyApp(ui, server)
关键部分说明
- 文件上传与读取:用
fileInput接收文件,通过reactive对象读取并存储数据框,兼容csv和Excel格式。 - 数据处理逻辑:将你的自定义处理脚本放在
process_and_merge_data函数中,只需替换函数内的代码即可实现你的业务需求。 - Excel导出:使用
openxlsx包的write.xlsx函数直接生成xlsx文件,避免了生成html的步骤。 - 交互优化:通过
observe和toggleState控制下载按钮的可用性,只有当两个文件都上传后才允许下载。
内容的提问来源于stack exchange,提问作者maxthebigdog
相关产品推荐
相关产品推荐

