web-dev-qa-db-fra.com

Comparaison de deux vecteurs dans une instruction if

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?

35
jon

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.

54
Aaron

Sont-ils identiques?

> identical(A,C)
[1] FALSE

Quels éléments ne sont pas d'accord:

> which(A != C)
[1] 2 4
25
Matthew Lundberg

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
7
Chase