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

R Shiny通过downloadHandler导出复选框为CSV及下载按钮失效修复

问题排查

你代码存在3个直接导致功能异常的问题:

  • ID不匹配:UI中下载按钮绑定的ID是download,但server端下载处理函数绑定的输出ID是download_checkboxes,Shiny的UI和server通过ID做关联,名称不一致时点击按钮不会触发任何逻辑。
  • 导出逻辑错误:现有逻辑仅对Antel和Fetal两个复选框组的选中值做逻辑与运算,既没有覆盖Maternal分组的选项,也没有匹配choiceNames和choiceValues的对应关系,完全不符合导出要求。
  • 语法错误:server函数定义末尾多了一个多余的右括号,会直接导致代码启动报错;另外Maternal分组下有个选项名拼写漏了首字母M,也一并修正。
修复后可运行代码
library(shiny)

# 统一预定义所有复选框配置,避免重复书写
checkbox_config <- list(
  Antel = list(
    names = c(
      "Urinary tract infections this pregnancy",
      "Urinary tract infections this pregnancy, treated",
      "Anemia this pregnancy (HCT < 30/Hgb <10)",
      "Hemoglobinopathy this pregnancy",
      "Coagulation disorder",
      "Rh sensitization",
      "Other iso-immunization",
      "Biliary/liver disorder(Yes at delivery)",
      "Cardiac disease",
      "Autoimmune disease",
      "Antiphospholipid syndrome",
      "Specify collagen vascular disease",
      "Asthma",
      "Acute or chronic lung disease",
      "Renal disorder/disease",
      "Renal dialysis or end stage renal disease",
      "Thyroid disease",
      "Cancer this pregnancy",
      "Cancer treatment this pregnancy"
    ),
    values = c(
      "RFC_INFUT","RFC_INFUTTX","RFC_ANEMIA","RFC_HEMO",
      "COAGULATION_DISORDER","RFC_RHS","RFC_ISO","BILARY_LIVE_DISORD",
      "RFC_CDDZ","RFC_CVDZ","RFC_APSY","RFC_CVSPEC","RFC_ASTH",
      "RFC_LGDZ","RENAL_DISORDER_DISEASE","RFC_RNDY","RFC_THYDZ",
      "RFC_CA","CANCER_TREATMENT"
    )
  ),
  Fetal = list(
    names = c(
      "Decreased fetal movement",
      "Abnormal fetal heart rate/rhythm",
      "Suspected IUGR this pregnancy",
      "Fetal compromise this pregnancy",
      "Suspected Fetal CNS Anomaly",
      "Diagnosed fetal anomaly:",
      "Fetal damage",
      "Postterm, > 41 6/7 weeks"
    ),
    values = c(
      "RFC_FETMOV","RFC_ABRHY","RFC_IUGR","RFC_FCOMP",
      "RFC_FEANOM","RFC_FAN","RFC_FD","RFC_POST"
    )
  ),
  Maternal = list(
    names = c(
      "Maternal traumatic injury during this pregnancy",
      "Domestic violence during this pregnancy",
      "Maternal surgical procedure during this pregnancy",
      "Other antenatal risk factors during this pregnancy:_____"
    ),
    values = c("RFC_TINJ","RFC_VIOL","RFC_SURG","RFC_OTHR")
  )
)

ui <- fluidPage(
  titlePanel(h1("Worksheet",align="center")),
  hr(),
  sidebarPanel(  
    titlePanel(h4("Antenatal Risk Factors/Current Pregnancy",align="center")),
    hr(),
    checkboxGroupInput(
      "Antel", "  ",
      choiceNames = checkbox_config$Antel$names,
      choiceValues = checkbox_config$Antel$values
    ),
    checkboxGroupInput(
      "Fetal", "Fetal Conditions",
      choiceNames = checkbox_config$Fetal$names,
      choiceValues = checkbox_config$Fetal$values
    ), 
    checkboxGroupInput(
      "Maternal", "Maternal Characteristics",
      choiceNames = checkbox_config$Maternal$names,
      choiceValues = checkbox_config$Maternal$values
    ),
    # 下载按钮放到侧边栏内,统一ID和server端一致
    downloadButton("download_checkboxes", "导出选中项为CSV")
  )
)

server <- function(input, output) {
  output$download_checkboxes <- downloadHandler(
    filename = function() {
      "selected_results.csv"
    },
    content = function(file) {
      # 收集所有分组的选中值
      all_selected <- c(input$Antel, input$Fetal, input$Maternal)
      export_df <- data.frame(
        choiceValues = character(),
        choiceNames = character(),
        stringsAsFactors = FALSE
      )
      # 匹配选中值对应的选项名称
      for (group in checkbox_config) {
        match_idx <- match(all_selected, group$values)
        valid_match <- which(!is.na(match_idx))
        if (length(valid_match) > 0) {
          export_df <- rbind(
            export_df,
            data.frame(
              choiceValues = all_selected[valid_match],
              choiceNames = group$names[match_idx[valid_match]],
              stringsAsFactors = FALSE
            )
          )
        }
      }
      # 导出CSV,带UTF-8编码避免乱码
      write.csv(export_df, file, row.names = FALSE, fileEncoding = "UTF-8")
    }
  )
}

shinyApp(ui = ui, server = server)
功能说明
  • 勾选任意分组下的选项后点击导出按钮,会自动生成包含choiceValues、choiceNames两个字段的CSV文件,每个选中项占一行。
  • 未选中任何选项时会导出仅带表头的空CSV文件,不会报错。
  • 所有选项配置统一在开头的checkbox_config中维护,后续修改选项不需要改动UI和导出逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:54:04