R语言QC检查脚本开发:验证用户输入匹配指定QC类型及多输入处理
QC检查脚本函数优化
原函数与需求
原函数片段:
askforQC_type <- \(qctype){ answer <- readline("What QC types would you like to run?") qualitycontroltypes <- c('BLK', 'DDL', 'DUP', 'FBLK', 'LCS', 'LCSD', 'LDUP', 'LMB', 'MS', 'MSD', 'NO3', 'RNS', 'SO4', 'SPI', 'SPL', 'TBLK') if(answer==qualitycontroltypes) { writeLines(paste("QC types chosen:", qctype)) } else { writeLines(paste("Sorry", qctype, "is not an applicable QC type")) } }
需求:
- 确保用户输入至少匹配
qualitycontroltypes中的一个值,不匹配则输出错误提示 - 支持逗号加空格分隔的多输入(如
BLK, LCS, LDUP),无需引号或c() - 输入
ALL则使用所有QC类型 - 返回的结果可直接用于后续
subset函数
已知单值可用answer %in% qualitycontroltypes匹配,但不知道怎么处理多输入。
优化后的函数
askforQC_type <- function() { # 定义允许的QC类型 qualitycontroltypes <- c('BLK', 'DDL', 'DUP', 'FBLK', 'LCS', 'LCSD', 'LDUP', 'LMB', 'MS', 'MSD', 'NO3', 'RNS', 'SO4', 'SPI', 'SPL', 'TBLK') while(TRUE) { answer <- readline("What QC types would you like to run? (输入ALL使用全部类型,或用逗号+空格分隔多个类型,如BLK, LCS, LDUP): ") answer <- trimws(answer) # 去除首尾空格 # 处理ALL输入 if(toupper(answer) == "ALL") { chosen_types <- qualitycontroltypes writeLines(paste("QC types chosen:", paste(chosen_types, collapse = ", "))) return(chosen_types) } # 处理逗号分隔的多输入 input_types <- strsplit(answer, ",\\s*")[[1]] # 按逗号+任意空格分割 input_types <- trimws(input_types) # 去除每个元素的空格 # 验证输入合法性 valid_types <- input_types[input_types %in% qualitycontroltypes] invalid_types <- input_types[!input_types %in% qualitycontroltypes] # 检查是否有至少一个合法类型 if(length(valid_types) > 0) { if(length(invalid_types) > 0) { writeLines(paste("警告:以下QC类型不合法,已忽略:", paste(invalid_types, collapse = ", "))) } writeLines(paste("QC types chosen:", paste(valid_types, collapse = ", "))) return(valid_types) } else { writeLines("错误:输入的QC类型均不合法,请重新输入!") writeLines(paste("允许的QC类型:", paste(qualitycontroltypes, collapse = ", "))) } } }
关键功能说明
- 多输入处理:用
strsplit(answer, ",\\s*")分割逗号加空格的输入,再用trimws清理每个元素的多余空格,将输入转换成向量格式 - ALL匹配:用
toupper(answer) == "ALL"实现不区分大小写的ALL输入匹配,直接返回全部QC类型 - 合法性验证:通过
%in%筛选合法与非法类型,存在非法类型时给出警告并自动忽略,无合法类型则提示重新输入 - 返回值使用:直接返回合法的QC类型向量,可直接传入
subset函数,例如subset(data, QC_type %in% chosen_types)
内容的提问来源于stack exchange,提问作者Matt Schaaf
相关产品推荐
相关产品推荐

