R:在 testthat 中进行错误比较的意外行为
R: Unexpected behaviour with error comparison in testthat
我正在实现一个辅助函数,它根据模板检查所提供参数的长度,并在长度不同时抛出错误。这是函数:
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)
Error in assert_character_vec_length(grp, 3) :
"grp" must be a character vector with length 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)
Error: error$message does not match "\"grp\" must be a character vector with length ncol(x)".
Actual value: ""grp" must be a character vector with length ncol(x)"
我错过了什么,这是怎么回事?
看看?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)
(实际上,在这里转义开头 (
就足够了。
但我发现当右括号也被转义时,阅读起来不会那么混乱。)
我正在实现一个辅助函数,它根据模板检查所提供参数的长度,并在长度不同时抛出错误。这是函数:
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)
Error in assert_character_vec_length(grp, 3) : "grp" must be a character vector with length 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)
Error: error$message does not match "\"grp\" must be a character vector with length ncol(x)". Actual value: ""grp" must be a character vector with length ncol(x)"
我错过了什么,这是怎么回事?
看看?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)
(实际上,在这里转义开头 (
就足够了。
但我发现当右括号也被转义时,阅读起来不会那么混乱。)