R中如何将双等长元素列表的两类异常校验逻辑整合为单一函数
双规则统一校验R函数实现
完全可以整合两套独立校验逻辑为单函数,通过优先级排序解决重叠场景的重复报错问题,匹配所有给定测试用例的预期校验行为。
核心校验规则与执行顺序
按照错误严重程度从高到低排序校验步骤,触发高优先级错误时直接终止后续流程,避免冗余提示:
- 第一类零值匹配校验(最高优先级)
- 逐位置对比x、y向量的取值,只要存在「某元素当前位置为0、对应另一元素同位置取值非0」的情况,直接抛出stop级错误
- 校验通过零值不匹配检查后,统计x、y同位置同时为0的数量,存在该类位置则抛出warning级警告
- 第二类非零取值一致性校验(次优先级)
- 分别提取x、y向量中的非零取值集合,校验集合内取值是否完全一致
- x的非零取值不一致:抛出提示
x校验失败的stop错误 - y的非零取值不一致:抛出提示
y校验失败的stop错误 - 两者的非零取值均不一致:抛出提示
x、y同时校验失败的stop错误
- 所有规则校验通过后,返回校验通过提示
validate_two_vec_list <- function(input_list) { # 基础前置校验 stopifnot( "输入为包含`x`、`y`两个元素的list" = all(c("x", "y") %in% names(input_list)), "x、y向量长度必须相等" = length(input_list$x) == length(input_list$y), "x、y必须为数值向量" = is.numeric(input_list$x) && is.numeric(input_list$y) ) x <- input_list$x y <- input_list$y # 第一类校验:零值位置不匹配检查 x_zero_pos <- which(x == 0) y_zero_pos <- which(y == 0) # 定位「x为0但y非0」、「y为0但x非0」的不匹配位置 mismatch_x0_y_non0 <- x_zero_pos[y[x_zero_pos] != 0] mismatch_y0_x_non0 <- y_zero_pos[x[y_zero_pos] != 0] all_zero_mismatch <- c(mismatch_x0_y_non0, mismatch_y0_x_non0) if (length(all_zero_mismatch) > 0) { stop( "零值位置不匹配错误:位置 ", paste(all_zero_mismatch, collapse = ", "), " 存在某元素为0、对应位置另一元素非0的情况" ) } # 检查双零位置,触发warning dual_zero_pos <- intersect(x_zero_pos, y_zero_pos) if (length(dual_zero_pos) > 0) { warning( "检测到共同零值位置:", paste(dual_zero_pos, collapse = ", "), " 处x、y取值同时为0" ) } # 第二类校验:非零取值一致性检查 x_nonzero_vals <- x[x != 0] y_nonzero_vals <- y[y != 0] bad_check_vec <- c() # 非零向量为空时直接判定通过 if (length(x_nonzero_vals) > 0 && length(unique(x_nonzero_vals)) != 1) { bad_check_vec <- c(bad_check_vec, "`x`") } if (length(y_nonzero_vals) > 0 && length(unique(y_nonzero_vals)) != 1) { bad_check_vec <- c(bad_check_vec, "`y`") } if (length(bad_check_vec) > 0) { stop( "非零取值一致性校验失败:", paste(bad_check_vec, collapse = "和"), " 所有非零取值未完全一致" ) } message("所有校验项通过") }
测试用例匹配验证
对照给定的测试场景,函数输出完全符合预期:
- 第一类规则场景
- 例A
list(x = c(0,0,2,2), y = c(3,3,1,1)):x前2位为0、对应y为3(非0),触发零值不匹配stop错误 - 例B
list(x = c(0,0,1,1), y = c(0,0,1,1)):零值位置完全对齐,触发双零warning;x、y的非零取值均为1,一致性校验通过 - 例C
list(x = c(0,1,1,0), y = c(2,1,0,0)):x第1位为0对应y为2、y第3位为0对应x为1,触发零值不匹配stop错误
- 例A
- 第二类规则场景
- 例A1
list(x = c(1,1,1,1), y = c(2,4,3,3)):x的非零取值全为1,y的非零取值包含2、4、3,触发提示y校验失败的stop错误 - 例B1
list(x = c(1,2,1,1), y = c(3,3,3,3)):y的非零取值全为3,x的非零取值包含1、2,触发提示x校验失败的stop错误 - 例C1
list(x = c(1,2,1,1), y = c(3,2,3,3)):x、y的非零取值均包含多个不同值,触发提示x和y同时校验失败的stop错误 - 例D
list(x = c(1,1,1,1), y = c(3,3,3,3)):无零值不匹配、无双零警告,x、y非零取值全一致,返回校验通过提示
- 例A1
内容的提问来源于stack exchange,提问作者rnorouzian
相关产品推荐
相关产品推荐

