2017-11-13 4 views
1

Ich implementiere eine Hilfsfunktion, die die Länge des bereitgestellten Parameters gegen eine Vorlage überprüft und einen Fehler auslöst, wenn die Längen unterschiedlich sind. Hier ist die Funktion:R: Unerwartete Verhalten mit Fehlervergleich 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)) 
} 

Unten ist ein Beispiel dafür ist Nutzung:

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

ich diese in einer anderen Funktion bin mit zu überprüfen, ob die übergebenen Parameter korrekt sind. Und ich schreibe auch Tests für die Funktion mit der testthat-Bibliothek.

Wenn ich die Länge mit einem einfachen Zahl allem bin im Vergleich funktioniert und der Test bestanden:

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) 

Aber zu meiner Überraschung der Fehlermeldung nicht übereinstimmt, wenn ich einen Ausdruck verwende die Längen zu vergleichen:

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

Was habe ich verpasst und was ist hier los?

Antwort

1

Werfen Sie einen Blick auf ?expect_output:

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

Der zweite Parameter den Namen „regexp“, und in der Tat, es als regulärer Ausdruck verwendet wird gegen testen.

Die ( und ) haben besondere Bedeutung in regulären Ausdrücken, genannt Capturing Groups. Wie geschrieben, stimmen diese ( und ) nicht mit den Buchstaben "(" und ")" in der Fehlermeldung überein.

Um sie wörtliche Klammern machen übereinstimmen, müssen Sie sie entkommen:

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

(Eigentlich ( die Öffnung entweicht hier genug sein wird Aber ich finde es weniger verwirrend zu lesen, wenn die schließenden Klammer ist. entkam auch.)

+0

Vielen Dank! Das komplett verpasst. Und ich dachte über den Unterschied zwischen "grp" ... "' und '" \ "grp \" ... "' und was es verursacht hat (laut der Fehlermeldung) –