진릿값
TRUE, T는 모두 참 값을 의미한다. FALSE, F는 거짓 값을 의미한다. 진릿값에는 &(AND), |(OR), !(NOT) 연산자를 사용할 수 있다.
> TRUE & TRUE [1] TRUE > TRUE & FALSE [1] FALSE > TRUE | TRUE [1] TRUE > TRUE | FALSE [1] TRUE > !TRUE [1] FALSE > !FALSE [1] TRUE
좀 더 엄밀히 말하면 TRUE와 FALSE는 예약어reserved word고 T, F는 각각 TRUE와 FALSE로 초기화된 전역 변수다. 따라서 다음과 같이 T에 FALSE를 할당하는 것이 가능하다! 반면 TRUE는 예약어므로 FALSE를 할당할 수 없다. 이런 이유로 TRUE, FALSE 대신 T, F라는 축약 표현을 사용할 때는 주의가 필요하다(가능하면 T, F 대신 TRUE, FALSE를 명시적으로 사용하는 것이 좋다).
> T <- FALSE > TRUE <- FALSE Error in TRUE <- FALSE : invalid (do_set) left-hand side to assignment
AND나 OR 연산자에는 &, | 외에도 &&와 ||가 있다. 이들의 차이점은 &, |는 진릿값이 저장된 벡터(배열)끼리 연산할 때 요소별로 계산을 한다는 점이다. 예를 들어, 다음 코드에서는 TRUE, TRUE가 저장된 벡터와 TRUE, FALSE가 저장된 벡터 간에 &(AND) 연산을 수행했다. 그 결과 두 벡터의 첫 번째 요소끼리의 연산 결과는 TRUE && TRUE = TRUE, 두 번째 요소끼리의 연산 결과는 TRUE && FALSE = FALSE가 되었다.
> c(TRUE, TRUE) & c(TRUE, FALSE)
[1] TRUE FALSE
반면 &&는 벡터의 요소 간 계산을 하기 위함이 아니라 TRUE && TRUE 등의 경우와 같이 두 개의 진릿값끼리 연산을 하기 위한 연산자다. 이는 ||와 |의 경우에도 마찬가지다. 예를 들어, 다음 코드를 보면 한 개의 값만 반환됨을 볼 수 있다.
> c(TRUE, TRUE) && c(TRUE, FALSE)
[1] TRUE
이로 미루어보면 언제 &, |를 써야 하고 언제 &&, ||를 써야 하는지 명확해진다. &, |는 벡터에 저장된 진릿값 간에 대량으로 논리 연산을 수행할 때 사용한다. &&, ||는 한 개의 진릿값만 필요한 if 문 등에서 사용한다.
또 &&, ||는 쇼트서킷short-circuit을 지원한다. 따라서 A && B 형태의 코드가 있을 때 A가 TRUE라면 B도 평가하지만, A가 FALSE라면 B를 평가하지 않는다.
언뜻 보기에는 &&나 ||를 &, |보다 많이 사용해야 할 것 같지만, R에서는 벡터 또는 리스트 내 요소를 한 번에 비교하는 연산이 많으므로 오히려 &나 |가 더 유용하다. 이에 대해서는 ‘2.4.3 벡터 연산’ 절에서 다시 다룬다.