2017-11-13 1 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 \"... "'의 차이점을 생각하고 있었고 (오류 메시지에 따라) –

관련 문제