2014-02-10 4 views
4

Я прочиталРазница между & и && в R

http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html

и разницу между & и & & не имеет смысла. Например:

> c(1, 2, 3) & c(1,2,3) 
[1] TRUE TRUE TRUE 

В соответствии со ссылкой это поведение ожидается. Он выполняет элементное сравнение двух векторов.

Так я тест снова ...

> c(1, 2, 3) && c(1,2,3) 
[1] TRUE 

Это также возвращает то, что ожидалось.

Но тогда я меняю значение ...

> c(1, 2, 3) && c(1,3,3) 
[1] TRUE 

Тем не менее ожидается, потому что ему короткое замыкание на первом элементе.

> c(1, 2, 3) & c(1,3,3) 
[1] TRUE TRUE TRUE 

Это, однако, потеряло меня. Эти два вектора не должны быть равны.

+0

Вы меня потеряли в 'c (1, 2, 3) & c (1,2,3)' Можете ли вы сказать, что вы думаете, что это оценивает? – rawr

+6

Я никогда не видел '&' использовано таким образом. Я не думаю, что это означает равный, вот что значит '=='. Это дает ожидаемый результат: 'c (1, 2, 3) == c (1,3,3)'. –

+3

Замените свои векторы такими вещами, как 'x <- c (TRUE, FALSE)' и 'y <- c (FALSE, TRUE)' и 'z <- c (TRUE, TRUE)' и поиграйте с 'x & y 'и' x && z' и посмотреть, можете ли вы это выяснить сейчас – rawr

ответ

11

& является логическим оператором, поэтому R покрывает ваши количества до логических значений перед сравнением. Для числовых значений любое значение, отличное от 0 (и не-NA/Null/NaN), получает значение TRUE, а 0 получает FALSE. Так что с тем, что вещи делают совсем немного смысла

> as.logical(c(1,2,3)) 
[1] TRUE TRUE TRUE 
> as.logical(c(1,3,3)) 
[1] TRUE TRUE TRUE 
> as.logical(c(1,2,3)) & as.logical(c(1,2,3)) 
[1] TRUE TRUE TRUE 
> as.logical(c(1,2,3)) & as.logical(c(1,3,3)) 
[1] TRUE TRUE TRUE 
8

Рассмотрим это, то это должно быть ясно:

as.logical(c(0,1,2,3,4)) 
#[1] FALSE TRUE TRUE TRUE TRUE 

Итак ...

c(1,2,3) & c(1,3,3) 
#[1] TRUE TRUE TRUE 

эквивалентно:

c(TRUE,TRUE,TRUE) & c(TRUE,TRUE,TRUE) 

... который сравнивает по элементам usin г & и возвращает c(TRUE,TRUE,TRUE)

Для справки:

test <- c(NA,NaN,-Inf,-1,-0.5,0,0.5,1,2,Inf) 
data.frame(test,as.logical(test)) 

# test as.logical.test. 
#1 NA    NA 
#2 NaN    NA 
#3 -Inf    TRUE 
#4 -1.0    TRUE 
#5 -0.5    TRUE 
#6 0.0   FALSE 
#7 0.5    TRUE 
#8 1.0    TRUE 
#9 2.0    TRUE 
#10 Inf    TRUE 
+1

В частности, '&' не проверяет, что векторы равны при оценке как 'numeric'. –

6

«&» оператор является лишь элемент его-элемента логического И, когда векторы имеют одинаковую длину. Вот почему вы должны также ожидать, этот результат:

c(0,1,2,3,4) & 1 
[1] FALSE TRUE TRUE TRUE TRUE # due to argument recycling 

Обратите внимание, что это не сравнение численных значений, но только после того, как принуждение к типу «логического», и любое ненулевое значение будет TRUE:

seq(0,1,by=.2) & -1 
[1] FALSE TRUE TRUE TRUE TRUE TRUE 

«& &» только сравнивает первый элемент его первого аргумента с первым аргументом второго и выдает предупреждение (но не ошибку), если оно длиннее одного элемента.

Если вы хотите проверить равенство, используйте «==».

+1

С обычными предупреждениями об использовании '==' с поплавками. –

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