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

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错误
  • 第二类规则场景
    • 例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非零取值全一致,返回校验通过提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 18:27:03