2012-04-29 32 views
26

Quiero poner la condición de detención dentro de una función. La condición es que si los elementos primero y segundo deben coincidir perfectamente en orden y longitud.Comparando dos vectores en una declaración if

A <- c("A", "B", "C", "D") 
B <- A 
C <- c("A", "C", "C", "E") 

> A == B 
[1] TRUE TRUE TRUE TRUE 

Esta es una buena situación para seguir adelante

> A == C 

[1] TRUE FALSE TRUE FALSE 

Dado que hay una falsa esta condición para parar y salida que la condición doesnot retención en la columna 2 y 4º.

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 

¿Falta algo obvio? También puedo dar salida donde están las posiciones de error?

Respuesta

39

all es una opción:

> A <- c("A", "B", "C", "D") 
> B <- A 
> C <- c("A", "C", "C", "E") 

> all(A==B) 
[1] TRUE 
> all(A==C) 
[1] FALSE 

Pero es posible que tenga que mirar hacia fuera para el reciclaje:

> 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 

El documentación para length dice que actualmente solo muestra un número entero de longitud 1, pero que puede cambiar en el futuro, por eso envolví la prueba de longitud en all.

+4

Su precaución sobre el reciclaje es la razón por la que debe usar' isTRUE (all.equal (D, E)) '. –

+1

Ver el código para 'all.equal.character' fue esclarecedor para mí. Debido al aspecto de "casi igualdad" para las carrozas, asumí que también hizo algo divertido por otras cosas. No estoy seguro de qué, en retrospectiva. Pero la única cosa no deseada que hace es verificar la igualdad de todos los atributos, incluidos los nombres. También tiene más cuidado con 'NA' que mi código simple anterior. – Aaron

18

¿Son idénticos?

> identical(A,C) 
[1] FALSE 

Qué elementos no están de acuerdo:

> which(A != C) 
[1] 2 4 
+4

'idéntico' también compara los atributos, que pueden ser o no deseables. –

+0

No hay atributos aquí, pero ese es un punto importante. Gracias. –

+0

'all.equal' también compara atributos, creo. – Aaron

7

probablemente me utilizo all.equal y which para obtener la información que desea. No se recomienda utilizar all.equal en un bloque if...else por algún motivo, por lo que lo envolvemos en isTRUE(). Ver ?all.equal para más:

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

Y en uso:

> 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 
+1

La razón es que cuando no son iguales, no devuelve 'FALSO' sino una descripción de cómo difieren. – Aaron

+0

@ Aaron - sí de hecho. La página de ayuda para '? Idéntico' ofrece más información sobre esto ... (que examiné después de publicarla) – Chase