참과 거짓 값은 logical 타입으로 표현해요.
이 타입에는 TRUE와 FALSE, 두 가지 값만 들어 있어요.
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
R에는 불리언 연산자가 다섯 개 있어요.
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
&&와 &는 불리언 "and"예요.
&&의 양쪽에 있는 표현식이 모두 TRUE이면 TRUE로 평가돼요.
||와 |는 불리언 "or"예요.
||의 어느 한쪽 표현식이 TRUE이면 TRUE로 평가돼요.
참고로 and/or 연산자에는 두 가지 세트가 있어요.
이 차이는 vector-filtering 개념에서 중요해지고, 아마 더 명확해질 거예요.
단일 값에 &와 |를 사용한 위 예제가 동작하는 이유는, 이 값들이 길이가 1인 벡터로 취급되기 때문이에요.
동작 방식은 두 문자로 된 연산자와 미묘하게 달라요. 후자만 "단축 평가"를 하거든요. 왼쪽 값만으로 결과가 정해지면 오른쪽 값은 평가하지 않아요.
따라서 TRUE || anything은 anything이 어떤 논리 표현식을 나타내든 항상 TRUE이므로, anything은 무시돼요.
길이가 2 이상인 벡터에 &&나 ||를 사용하면 비교에 첫 번째 원소만 사용돼요. 그래서 TRUE/FALSE 하나만 나오고, 아마 경고 메시지도 함께 나올 거예요.
아마 의도한 것과는 다를 거예요.
!는 불리언 "not"이에요.
TRUE와 FALSE 값을 서로 바꿔요.
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
표현식이 길고 복잡할수록, 의도를 분명히 하려면 괄호를 사용하는 게 좋아요.
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
배타적 논리합(즉, A 또는 B이지만 둘 다는 아님)을 위한 중위 연산자는 없어요. 이럴 때는 xor() 함수를 사용할 수 있어요.
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE