代码之家  ›  专栏  ›  技术社区  ›  Karolis Koncevičius

R: 测试中出现错误比较的意外行为

  •  1
  • Karolis Koncevičius  · 技术社区  · 8 年前

    我正在实现一个助手函数,该函数根据模板检查所提供参数的长度,并在长度不同时抛出错误。以下是函数:

    assert_character_vec_length <- function(x, ...) {
      name   <- as.character(substitute(x))
      lens   <- unlist(list(...))
      lnames <- as.character(substitute(list(...)))[-1]
      lnames <- paste(lnames, collapse=' or ')
      if(!(length(x) %in% lens) | !is.character(x))
        stop(paste0('"', name, '"', ' must be a character vector with length ', lnames))
    }
    

    下面是它的用法示例:

    grp <- LETTERS[1:4]
    assert_character_vec_length(grp, 3)
    

    assert\u character\u vec\u长度错误(grp,3): “grp”必须是长度为3的字符向量

    我在另一个函数中使用它来检查传递的参数是否正确。我还使用 testthat 图书馆

    当我将长度与一个简单的数字进行比较时,一切正常,测试通过:

    x <- matrix(1:100, ncol=10)
    grp <- LETTERS[1:4]
    
    err1 <- '"grp" must be a character vector with length 10'
    expect_error(assert_character_vec_length(grp, 10), err1)
    

    但令我惊讶的是,当我使用表达式来比较长度时,错误消息不匹配:

    err2 <- '"grp" must be a character vector with length ncol(x)'
    expect_error(assert_character_vec_length(grp, ncol(x)), err2)
    

    错误:错误$消息不匹配“\”grp\”必须是长度为ncol(x)”的字符向量。 实际值:“grp”必须是长度为ncol(x)的字符向量

    我错过了什么?这里发生了什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   janos slartidan    8 年前

    看看 ?expect_output :

    expect_output(object, regexp = NULL, ..., info = NULL, label = NULL)
    

    第二个参数名为“regexp”, 事实上, 它被用作测试的正则表达式。

    这个 ( ) 在正则表达式中有特殊意义, 称为捕获组。 如前所述 ( 和 将与错误消息中的文字“(”和“)”字符不匹配。

    要使它们匹配文字括号,需要对其进行转义:

    err2 <- '"grp" must be a character vector with length ncol\\(x\\)'
    expect_error(assert_character_vec_length(grp, ncol(x)), err2)
    

    (实际上,逃离开口 ( 在这里就足够了。 但我发现,当右括号也转义时,阅读起来就不那么混乱了。)