2017-11-13 5 views
1

テンプレートに対して提供されたパラメータの長さをチェックし、長さが異なる場合にエラーをスローするヘルパ関数を実装しています。ここでは関数です:私は渡されたパラメータが正しいかどうかを確認するために、別の関数内でこれを使用していますR:テストでのエラー比較による予期しない動作

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

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)) 
} 

以下はその一例であることは使い方です。また、ライブラリの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)"

私は何を逃したとここで何が起こっていますか?

答えて

1

?expect_outputを見てみましょう:

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

二番目のパラメータは、「正規表現」と命名され、実際に とを、 に対してテストするために、正規表現として使われています。

(および)は、キャプチャグループと呼ばれる正規表現では特別な意味を持ちます。 書かれているように、これらの()は、エラーメッセージのリテラル "("と ")"文字と一致しません。

彼らは文字通りの括弧を一致させるために、あなたがそれらをエスケープする必要があります。

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

(実際には、開口部(をエスケープすることは、ここで十分でしょう しかし、私は閉じ括弧があるとき、それは読んであまり混乱だ見つけますエスケープしました。)

+0

ありがとう!完全にそれを逃した。そして私は、 "" "grp" ... "と" "grp \" ... "との違いについて考えていました。それを(エラーメッセージごとに) –

関連する問題