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

如何配置Shiny Server实现单参数输入与批量文件上传计算切换

解决方案

要实现单次计算和批量计算的切换,可以通过以下步骤修改你的Shiny应用:

1. 优化UI布局,添加模式选择控件

在侧边栏添加单选按钮组让用户选择计算模式,并用conditionalPanel根据选择显示对应的输入区域,避免界面元素混乱。

2. 完善Server逻辑,处理两种计算模式

在响应Run按钮的逻辑中,根据用户选择的模式,分别执行单次计算或批量计算:

  • 单次模式:直接使用输入的G和N调用计算函数
  • 批量模式:读取上传的CSV文件,对每一行的G和N应用计算函数,并将结果与原ID合并

完整修改后的代码

## Sample data to upload .........
file1 <- data.frame(ID=1:10, G=seq(10,100,10),N=seq(400,1300,100))
write.csv(file1, "file1.csv", row.names = FALSE)  # 去掉行名,避免读取时出错

## Sample function .........
func. <- function(G, N){
  z1=exp(2.263+0.865*log(G/N))
  z2=exp(2.475+0.402*log(G/N))
  z3=exp(2.603+0.374*log(G/N))
  z4=exp(2.758+0.358*log(G/N))
  Z <- data.frame(z1,z2,z3,z4)
  return(Z)
}

## The shinyAPP ..........
library(shiny)

ui <- fluidPage(
  headerPanel("Stand"),
  
  sidebarPanel(
    h3("计算模式选择"),
    radioButtons("calc_mode", "选择计算模式:",
                 choices = c("单次计算", "批量计算"),
                 selected = "单次计算"),
    
    conditionalPanel(
      condition = "input.calc_mode == '单次计算'",
      h3("单次计算参数"),
      numericInput("G", "G", min=0.00, max=300.00, value=25),
      numericInput("N", "N", min=100, max=1500, value=350)
    ),
    
    conditionalPanel(
      condition = "input.calc_mode == '批量计算'",
      h3("批量计算文件上传"),
      fileInput("file", "上传包含ID、G、N的CSV文件", accept = ".csv")
    ),
    
    actionButton("runScript", "执行计算")
  ),
  
  mainPanel(
    tabsetPanel(
      tabPanel("计算结果", tableOutput("table"))
    )
  )
)

server <- function(input, output) {
  
  dt <- eventReactive(input$runScript,{
    if(input$calc_mode == "单次计算"){
      # 单次计算:调用函数并包装结果
      result <- func.(input$G, input$N)
      # 添加虚拟ID让格式统一
      cbind(ID = "单次计算", result)
    } else {
      # 批量计算:读取上传文件并处理
      req(input$file)  # 确保文件已上传
      upload_data <- read.csv(input$file$datapath)
      # 检查必要列是否存在
      if(!all(c("ID", "G", "N") %in% colnames(upload_data))){
        return(data.frame(错误 = "上传文件必须包含ID、G、N三列"))
      }
      # 对每一行应用计算函数
      calc_results <- do.call(rbind, lapply(1:nrow(upload_data), function(i){
        func.(upload_data$G[i], upload_data$N[i])
      }))
      # 合并ID和计算结果
      cbind(upload_data["ID"], calc_results)
    }
  })
  
  output$table <- renderTable({
    dt()
  })
}

shinyApp(ui, server)

关键说明

  • 模式切换:通过radioButtons和conditionalPanel实现界面动态切换,用户操作逻辑更清晰
  • 批量计算处理:使用req()确保文件已上传,添加列检查避免错误输入,通过lapply和do.call(rbind, ...)批量处理每行数据
  • 结果格式统一:单次计算结果添加"单次计算"的ID,让两种模式的输出表格格式一致

内容的提问来源于stack exchange,提问作者Friday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:35:19