모든 프로그래밍 언어는 제어문을 갖고 있습니다. 제어문이란 코드(명령)의 흐름을 제어할 수 있는 문법으로써, 반복문 ∙ 조건문 ∙ 분기문을 의미합니다. 우리는 이들을 사용해 더 다양한 작동 방식을 구현하거나, 반복(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)
}