2012-04-29 2 views
26

Я хочу, чтобы функция останова была включена в функцию. Условие состоит в том, что если первый и второй элементы должны соответствовать по порядку и длине.Сравнение двух векторов в выражении if

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

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

Это хорошая ситуация, чтобы идти вперед

> A == C 

[1] TRUE FALSE TRUE FALSE 

Поскольку существует одна ложь это условие, чтобы остановить и вывод, что условие оленья кожа держать на 2 и 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 

Я пропустил что-то очевидное? Также я могу вывести, где находятся позиции ошибок?

ответ

39

all является одним из вариантов:

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

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

Но вы, возможно, придется следить за утилизацию:

> 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 

документация для length говорит, что в настоящее время он выводит только целое число длиной 1, но может измениться в будущем, поэтому я завернул проверку длины в all.

+4

Ваша осторожность в отношении утилизации - вот почему вы должны использовать' isTRUE (all.equal (D, E)) '. –

+1

Взгляд на код для 'all.equal.character' был для меня полезным. Из-за «почти равного» аспекта этого для плавающих я предположил, что он сделал что-то смешное для других вещей тоже. Я не уверен, что, в ретроспективе. Но единственная, возможно, нежелательная вещь - проверить равенство всех атрибутов, включая имена. Это также требует большей осторожности с 'NA', чем мой простой код выше. – Aaron

18

Они идентичны?

> identical(A,C) 
[1] FALSE 

Какие элементы не согласны:

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

«идентичный» также сравнивает атрибуты, которые могут быть или не быть желательными. –

+0

Здесь нет атрибутов, но это важный момент. Благодарю. –

+0

'all.equal' также сравнивает атрибуты, я считаю. – Aaron

7

Я бы, вероятно, использовать all.equal и which, чтобы получить информацию, которую вы хотите. По какой-то причине не рекомендуется использовать all.equal в блоке if...else, поэтому мы завершаем его в isTRUE(). См ?all.equal больше:

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

и в использовании:

> 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

Причина в том, что когда они не равны, они не возвращают 'FALSE', а описание того, как они отличаются. – Aaron

+0

@ Аарон - да, действительно. Страница справки для '? Identity' дает более подробную информацию об этом ... (который я просмотрел после публикации) – Chase

Смежные вопросы