14.3 ifelse() 함수

위와 같이 명령문에서 한 줄의 코드만 실행되는 간단한if ... else 문은 간단한 대체적인 방식으로 작성될 수 있습니다. 다음 대안은 매우 짧은ifelse() 함수의 사용 예입니다.

ifelse() 함수의 형식은 다음과 같습니다.

ifelse(test, yes, no)

  • test : 조건식입니다.
  • yes : 조건식이 TRUE 일 때 실행되는 TRUE 블럭에 해당합니다.
  • no : 조건식이 FALSE일때 실행되는 FALSE 블럭에 해당합니다.

여기서 test는 논리형 벡터 (또는 논리로 강제 변환 될 수있는 개체)여야 합니다. 반환 값은 test와 길이가 같은 벡터입니다.

ifelse() 함수에 의해 반환되는 벡터는 test의 값이 TRUE 인 경우 yes의 요소가 되고, test의 값이 FALSE 인 경우 no의 요소가 됩니다.

즉, test[i]TRUE이면 결과의 i 번째 요소는 yes[i]가 됩니다. FALSE이면 no[i]의 값을 반환하게 됩니다. 벡터 yesno는 필요할 때마다 자동 채우기(recycling)가 됩니다.

ifelse() 함수의 사용에 대한 간단한 예를 들어 보겠습니다.

# 벡터 a의 요소들이 짝수이면 "even", 홀수 이면 "odd"를 반환합니다.
a <- c(5, 7, 2, 9)                           # 예제 벡터입니다.
ifelse(a %% 2 == 0, "even", "odd")           # a %% 2 == 0 벡터 나머지 연산을 하여 결과를 반환합니다.
## [1] "odd"  "odd"  "even" "odd"

위의 예에서 test에 해당하는 a %% 2 == 0의 반환결과는 논리형 벡터로 (FALSE, FALSE, TRUE, FALSE)가 됩니다.

마찬가지로 함수 인수의 다른 두 벡터인 yesno는 각각 ( "even", "even", "even", "even")( "odd", "odd", "odd", "odd")로 자동 채우기가 됩니다. 따라서 결과는 test가 반환하는 벡터의 요소 값에 따라 평가가 되어 최종 결과로 (“odd”, “odd”, “even”, “odd”)가 반환됩니다.

앞에서 살펴본 예를 ifelse() 함수를 이용하면 간단하게 작성할 수 있습니다.

x <- c(8, 3, 2, 5)

# ifelse() 함수의 이용 방법
ifelse(any(x < 0), "x contains negative numbers", "x contains all positive numbers")
## [1] "x contains all positive numbers"