모든 프로그래밍 언어는 제어문을 갖고 있습니다. 제어문이란 코드(명령)의 흐름을 제어할 수 있는 문법으로써, 반복문 ∙ 조건문 ∙ 분기문을 의미합니다. 우리는 이들을 사용해 더 다양한 작동 방식을 구현하거나, 반복(iteration) 작업을 쉽게 처리할 수 있습니다. R에서는 주로 데이터 전처리와 시각화 부분에서 사용되며 더 나아가 기계 학습에서도 배깅(bagging) 등의 알고리즘을 직접 구현할 때 사용합니다.
22.1. 조건문(Conditional statements)
(1) 조건문에 대한 이해
R에서 조건문은 if
문, else if
문, else
문으로 구성됩니다. 위의 세 구문을 통해 조건의 범위를 지정할 수 있고, 조건에 맞는 구문을 실행할 수 있습니다. 이러한 프로세스에 대한 이해는 다음과 같은 그림으로 표현할 수 있습니다.

출처 : https://linuxhint.com/if-else-else-if-statements-javascript/
또한 R에서 조건에 따라 실행할 구문(block-statement)은 { }
으로 포함하는 방식으로 설계됩니다.
(2) if
문
if
문은 조건이 TRUE
인 경우에 해당하는 구문을 실행하고자 할 때 사용합니다. if
문의 구조는 다음과 같습니다,
if(condition){code-block} |
(3)else if
문
else if
문은 if
문의 조건에 FALSE
하면서, 다음 조건이 TRUE
인 값을 출력하고 싶을 때 사용합니다. 다만 주의할 점은 elseif가 아닌 else if로 중간에 띄어쓰기를 입력해야합니다.
else if(condition){code-block} |
(4) else
문
if
문과 else if
문의 조건에 FALSE
일 때 해당하는 구문을 실행하고자 할 때 사용합니다. else
문은 단독으로 사용할 수 없으며, else
문의 구조는 다음과 같습니다.
else{code-block} |
(5) 예시
어떠한 수학 시험에서 85점 이상일 때 A, 85점 미만 75점 이상일 때 B, 75점 이하 65점 이상일 때 C, 그 이하는 D를 출력하는 코드를 정의하고자 하고, 수학 점수는 80점일 때 예시는 다음과 같습니다.
MATH_SCORE <- 80
if(MATH_SCORE >= 85){
print("GRADE : A")
} else if(MATH_SCORE >= 75){
print("GRADE : B")
} else if(MATH_SCORE >= 65){
print("GRADE : C")
} else{
print("GRADE : D")
}

22.2. 반복문(Iteration Statement; Loop Statement)
(1) 반복문의 정의
반복문은 똑같은 코드 명령을 일정 횟수만큼 반복하기 위한 구문입니다. 반복문을 사용하여 코드 작업을 축약할 수 있어 효율적인 코드 관리가 가능해집니다. R에서의 반복문은 for
문, while
문, repeat
문으로 존재합니다.
(1) for
문
for
문은 벡터(혹은 스칼라)와 범위를 지정하고, 벡터에 있는 원소 값에 대응하여 순서대로 수행문을 반복하는 문법입니다. for
문의 구조는 다음과 같습니다.
for(variable in vector){code-block} |
예를 들어 10초를 세고 0초 일 때 로켓을 발사하는 for
문을 다음과 같이 정의할 수 있습니다.
for(i in 10:1){
cat("count: ", i, "\n", sep="")
Sys.sleep(time=1) #코드 실행을 1초간 지연시키는 함수
if(i==1){cat("count: 0,", "Launch!")}
}

(2) while
문
while
문은 for
문과는 다르게 벡터의 원소값(범위)을 정하지 못할 때 사용되는데, 조건이 참일 때 구문을 진행합니다. while
문의 구조는 다음과 같습니다.
while(condition){code-blcok} |
예를 들어 RPG 게임에서 탱커의 HP가 100이고 적(몬스터)에게 1초마다 0~30 사이의 랜덤한 데미지를 받을 때, 몇 번 데미지를 받아야 전사가 죽는지에 대한 코드는 다음과 같습니다.
tanker_HP <- 100 #탱커의 HP 설정
attack_damage <- sample(x=0:30, size=1) #몬스터의 공격력 설정
while(tanker_HP>0){
if(tanker_HP == 100){ #탱커의 초기 설정된 HP 출력
cat("Current Tanker's HP is ", tanker_HP, "\n", sep="")
}
Sys.sleep(time=1)
if(tanker_HP <= attack_damage){ #탱커가 죽었을 때 메세지 출력
cat("Attack damage is ", attack_damage, ", Tanker is Dead.", sep="")
break
}
else{ #탱커가 HP가 여유로울 때 메세지 출력
tanker_HP = tanker_HP - attack_damage
cat("Attack damage is ", attack_damage, ", Current Tanker's HP is ", tanker_HP, "\n", sep="")
attack_damage = sample(0:30, 1)
}
}

(3) repeat
문
repeat
문은 while
문과 다르게, 조건에 상관없이 수행문을 진행합니다. 그래서 무한루프의 상태에서 반복을 수행하고, 이후 제어문인 break
문으로 무한루프를 빠져나와 출력 결과를 도출합니다. repeat
문의 구조는 다음과 같습니다.
repeat{code-block} |
예를 들어 러시안 룰렛 게임(Russian Roulette Game)을 진행하는 repeat
문은 다음과 같습니다.
player1_index_bullet = sample(x=1:6, size=1) #player1의 총알 인덱스 설정
player2_index_bullet = sample(x=1:6, size=1) #player2의 총알 인덱스 설정
player1_index_trigger = sample(x=1:6, size=1) #player1의 초기 격발 인덱스 설정
player2_index_trigger = sample(x=1:6, size=1) #player2의 초기 격발 인덱스 설정
repeat{
if(player1_index_bullet == player1_index_trigger){
Sys.sleep(time=1)
cat("Tang! player1 is dead.","\n")
break
} else{
Sys.sleep(time=1)
cat("Tick! player1 is alive.", "\n")
player1_index_trigger = player1_index_trigger + 1L #player1의 격발 인덱스 업데이트
if(player1_index_trigger==7L){
player1_index_trigger=1L #player1의 격발 인덱스가 6이 넘어갈 경우, 1로 초기화
}
}
if(player2_index_bullet == player2_index_trigger){
Sys.sleep(time=1)
cat("Tang! player2 is dead.","\n")
break
} else{
Sys.sleep(time=1)
cat("Tick! player2 is alive.", "\n")
player2_index_trigger = player2_index_trigger + 1L #player2의 격발 인덱스 업데이트
if(player2_index_trigger==7L){
player2_index_trigger=1L #player2의 격발 인덱스가 6이 넘어갈 경우, 1로 초기화
}
}
}

22.3. 분기문(Branch Statement ; Jump Statement)
(1) 분기문의 정의
분기문은 반복의 흐름을 제어하는 구문입니다. 조건문과 반복문에 중간에서 주어진 조건의 흐름을 바꿀 수 있으며, R에서 분기문은 break
문, next
문이 존재합니다.
(2) break
문
break
문은 반복문을 벗어나는 데 사용됩니다. 주로 if
문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 합니다.
(3) next
문
next
문은 반복문 내만 사용될 수 있으며, 조건에 따른 next
문을 만나게 되면 다음 반복으로 스킵합니다.
(4) 예시
예를 들어 1부터 20까지의 정수를 출력하는 for
문을 생성할 때, 2의 배수와 15 이상의 정수는 출력하지 않고자할 때 코드는 다음과 같습니다.
for(i in 1:20){
if(i %% 2 == 0){
next
}
else if(i == 15){
break
}
print(i)
}

'Ⅰ. R 기초' 카테고리의 다른 글
23. 사용자정의함수 파악하기 (0) | 2021.05.21 |
---|---|
21. 내부 데이터 저장하기 (수정중) (0) | 2021.05.18 |
20. 외부 데이터 불러오기 (수정중) (0) | 2021.05.17 |
19. 선형대수 연산 시행하기 (수정중) (0) | 2021.05.14 |