Je veux mettre la condition d'arrêt à l'intérieur d'une fonction. La condition est que si les premier et deuxième éléments doivent correspondre parfaitement dans l'ordre et la longueur.
A <- c("A", "B", "C", "D")
B <- A
C <- c("A", "C", "C", "E")
> A == B
[1] TRUE TRUE TRUE TRUE
C'est une bonne situation pour aller de l'avant
> A == C
[1] TRUE FALSE TRUE FALSE
Puisqu'il y a une fausse cette condition pour s'arrêter et sortir que la condition ne se maintient pas aux 2 et 4 ème colonnes.
if (A != B) {
stop("error the A and B does not match at column 2 and 4"} else {
cat ("I am fine")
}
Warning message:
In if (A != B) (stop("error 1")) :
the condition has length > 1 and only the first element will be used
Suis-je en train de manquer quelque chose d'évident? Je peux également afficher les positions d'erreur?
all
est une option:
> A <- c("A", "B", "C", "D")
> B <- A
> C <- c("A", "C", "C", "E")
> all(A==B)
[1] TRUE
> all(A==C)
[1] FALSE
Mais vous devrez peut-être faire attention au recyclage:
> D <- c("A","B","A","B")
> E <- c("A","B")
> all(D==E)
[1] TRUE
> all(length(D)==length(E)) && all(D==E)
[1] FALSE
La documentation de length
indique qu'il ne produit actuellement qu'un entier de longueur 1, mais qu'il peut changer à l'avenir, c'est pourquoi j'ai encapsulé le test de longueur dans all
.
Sont-ils identiques?
> identical(A,C)
[1] FALSE
Quels éléments ne sont pas d'accord:
> which(A != C)
[1] 2 4
J'utiliserais probablement all.equal
Et which
pour obtenir les informations que vous souhaitez. Il n'est pas recommandé d'utiliser all.equal
Dans un bloc if...else
Pour une raison quelconque, nous l'encapsulons donc dans isTRUE()
. Voir ?all.equal
Pour en savoir plus:
foo <- function(A,B){
if (!isTRUE(all.equal(A,B))){
mismatches <- paste(which(A != B), collapse = ",")
stop("error the A and B does not match at the following columns: ", mismatches )
} else {
message("Yahtzee!")
}
}
Et en cours d'utilisation:
> foo(A,A)
Yahtzee!
> foo(A,B)
Yahtzee!
> foo(A,C)
Error in foo(A, C) :
error the A and B does not match at the following columns: 2,4