프로그래밍 /R

[R] 제어문(if, if~else if~, switch, ifelse)

yooj_lee 2019. 6. 12. 21:19
300x250

- 제어문

1. if문

1) if (조건문) {

    action

}

: 조건문이 TRUE이면, action을 수행하고 FALSE이면 아무 일도 일어나지 않는다.

2) if (조건문) {

    action

} else {

    action2

}

: 조건문이 TRUE이면, action을 수행하고 FALSE이면 action2를 수행한다.

 

2. if~ else if~

python의 elif와 같은 맥락이다. 여러 조건을 순차적으로 check하게 된다. 이때 각 조건은 서로 배타적이다.

if(조건문1){

    action

} else if(조건문2){

    action2

} else {

    action3

}

: 조건문1이 TRUE이면 action을 수행한다. 조건문1이 FALSE일 경우 조건문2를 test해서 TRUE면 action2를 수행한다. 조건문2가 FALSE이면 action3를 수행한다.

 

3. switch

다양한 케이스에 대해 테스트를 해야 하는 경우, else if를 반복적으로 사용하는 것은 번거롭고 비효율적일 수 있다. 이때 switch문을 사용하면 매우 유용하다.

switch(value, case1 = action1, case2 = action2, ..., other)

이때, value는 테스트하고자 하는 값이다. 각각 case와 action은 특정 값(value == case?)과 그에 대한 결과값(return action when value == case)이다. 마지막 인자 other는 매핑되는 결과가 없을 때 주어지는 값으로 기본 결과값이다.

ex) use.switch <- function(x){

switch(x, 'a' = 'first', 'b' = 'second', 'z' = 'last', 'c' = third', 'other') }

 

use.switch('a')

> 'first'

use.switch('b')

> 'second'

use.switch('c')

> 'third'

use.switch('d')

> 'other'

use.switch('z')

> 'last'

 

 

4. ifelse

ifelse(arg1, arg2, arg3) when arg1 = 테스트될 조건, arg2 = 테스트가 TRUE일 경우 리턴되는 값, arg3 = 테스트가 FALSE일 경우 리턴되는 값.

ifelse는 벡터화된 인자를 사용할 수 있는데 이것이 바로 기존 if와 다른 점이며 ifelse의 장점이라 할 수 있다. 벡터화를 사용하면 반복문 사용을 피할 수 있고, 코드의 실행 속도 또한 향상된다. (즉, ifelse 개꿀) 그러나 하나의 조건문을 테스트할 때는 if를 사용하는 것이 훨씬 효율적이다.

ex) ifelse(1 == 1, "Yes", "No")

> "Yes"

toTest <- c(1,1,1,0,1,0,1)

ifelse(toTest == 1, "Yes", "No")

> "Yes" "Yes" "Yes" "No" "Yes" "No" "Yes"

 

TRUE와 FALSE 인자에는 테스트하는 원소가 들어갈 수 있다(if n == 1 : return n*3 else return n 처럼)

ifelse(toTest == 1, toTest * 3, toTest)

> 3 3 3 0 3 0 3

cf.) toTest가 NA 원소를 가지고 있는 경우, NA에 대한 ifelse의 결과는 NA다.

 

* 복합 테스트

여러 개(두 개 이상)의 조건을 테스트하고 싶을 때는 and와 or 논리연산자를 사용하면 된다.

and → &&, &

or → ||, |

 

이때 ifelse문은 단일형태 연산자가 필요하며 이중형태는 if문에 가장 적합하다. 이중형태는 두 구문의 오직 하나의 원소만 비교하지만, 단일 형태는 두 구문의 모든 원소를 비교한다. 따라서 벡터화된 인자를 사용하지 않는 if문은 이중형태가 적합한 것이며 벡터화된 인자를 사용할 수 있는 ifelse문은 이중형태 사용이 불가능한 것이다(인자로 전달된 벡터 중 가장 첫번째 요소만 테스트하고 더 이상 테스트하지 않기 때문).

 

또한 단일 형태 연산자는 언제든 연산자 양쪽 조건을 다 테스트하지만, 이중 형태 연산자는 때때로 연산자 왼쪽 구문만 테스트하고 결과를 리턴할 수 있다.

ex) 3 == 3 || 0 != 0 

→ 이미 3 == 3 이 참이므로, 뒤의 구문을 테스트할 필요 없이 TRUE를 리턴한다.

2 != 2 && 0 == 1

→ 이미 2 != 2 가 거짓이므로, 뒤의 구문을 테스트할 필요 없이 FALSE를 리턴한다.

특히 왼쪽 구문이 FALSE일 경우, 오른쪽 구문이 에러가 날 때 이중 형태 연산자를 사용하면 유용하다.

 

 

300x250