You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:52:47