데이터 분석/R 데이터 처리 & 분석

[R] 반복문 사용하기 (for, while, break, next)

love R 2020. 10. 27. 00:35
반응형

[R] 반복문 사용하기 (for, while, break, next)

 

다른 프로그래밍 언어와 마찬가지로 R에서도 반복문을 사용할 수 있습니다.

문법 자체는 크게 다를 바 없기 때문에 기존에 프로그래밍 언어 경험이 있는 분들은 쉽게 쓸 수 있습니다. 

 

1. for 반복문

1.1. 용법

# data의 값을 x에 할당한 후 문장 수행

for( x in data) {

    수행문장

}

 

1.2. 예시

1~5까지의 수를 print함수를 이용하여 각각 결과를 찍어보겠습니다.

변수 x에 1부터 5까지 각각 할당하면서 print(x) 함수로 각 결과가 나옵니다(변수명은 어떤 걸 써도 상관없음!).

# 1부터 5까지 print
for(x in 1:5){ 
   print(x)

}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5


# 1부터 5까지 2로 나눈 값을 print
for(x in 1:5){
  print(x/2)
}

[1] 0.5
[1] 1
[1] 1.5
[1] 2
[1] 2.5


# 변수 test_x에 100,101,102,103을 할당 후 for 문에서 사용
test_x <- c(100, 101, 102, 103)
for(x in test_x){
  print(x)
}

[1] 100
[1] 101
[1] 102
[1] 103

 

 

이제 for문에 if 함수를 중첩하여 사용해보겠습니다.

예를 들어 for문을 이용해서 짝수만 print 하고 싶으면 다음과 같이 합니다.

# 변수 i에 1부터 10까지 할당한 후,
# if문을 통해 나머지가 0인 수를 색출합니다.
# %%연산자는 나머지를 구함  ex) a %% b: a를 b로 나눈 나머지

for(i in 1:10){
  if(i %% 2==0){  
    print(i)
  }
}

 

Exam1. for문을 이용하여 1~20에서 3의 배수를 구하시오.

(코드는 맨 뒤쪽에)

 

 

 

2. while

2.1. 용법

while(조건) {

           조건이 참일 때 수행문장

}

while문은 괄호 안에 있는 조건이 참일 경우에 블록 안에 있는 문장을 수행합니다.

 

<while문이 for문과 다른 점>

(1) while문은 반복 + 조건이 같이 들어간 혼합 형태

(2) while문은 반복횟수 지정이 불필요

 

 

2.2. 예시

아래 코드를 보면 z에 먼저 1을 할당하고 조건이 참이면 print(z)를 수행합니다. 그 이후 +1 하여 다시 위로 올라가 해당 문장을 반복합니다.

 

보다시피 처음 초기값(z <- 1)을 지정하는 것 외에는 따로 반복 횟수를 지정하지 않습니다. 따라서 +1 하여 변수를 갱신해주는 형태입니다. 주의해야 할 점은 만약 z <- z+1 을 쓰지 않으면 무한루프(infinite loop)에 빠지게 됩니다. 왜냐하면 z에는 계속 1이 할당되어 있는 형태이기 때문이죠..

# 1부터 10까지 print하기
z <- 1    # 할당될 변수를 지정
while(z <=5){    # z가 5보다 작은 경우 문장 수행
  print(z)         
  z <- z+1        # z의 값을 +1 하여 새로운 값으로 갱신
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5



# 무한루프
# 결과값을 실행하면 조건식이 항상 참이 되어 1을 계속 찍어냅니다.

z <- 1
while(z<=10){
    print(z)
}

[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
  .
  .
  .

 

Exam2. while문을 이용하여 1~20에서 2의 배수를 구하시오.

(코드는 맨 뒤쪽에)

 

 

 

3. break

3.1. 용법

break는 반복문을 종료하는 함수인데, 주로 조건문과 결합하여 사용합니다.

반복문 안에서 break 함수를 만나면 해당 반복문을 중지하고 빠져나옵니다.

 

 

3.2. 예시

# 변수 test에 1이 할당된 후 break 함수를 만나 1만 출력됨
for(test in 1:10){
  print(test)
  break
}

[1] 1


# 3까지 출력하기
for(test in 1:10){
  if(test == 4){  # test의 값이 4이면 반복문을 멈춤
    break
  }
  print(test)
}

[1] 1
[1] 2
[1] 3

 

 

4. next

4.1. 용법

next는 수행 중인 반복을 중지하고 다음 반복으로 넘어가는 함수입니다.

break함수와 마찬가지로 조건문과 결합하여 자주 사용됩니다.

 

4.2. 예시

# 짝수만 찍기
for(pp in 1:10){
  if(pp %% 2 != 0){    # 변수 pp의 값을 2로 나눌 때 나머지가 0이 아닌 경우(홀수)
    next                   # next 함수를 사용하여 다음 반복을 실행
  }
  print(pp)
}

 

 

Exam3. 변수 p에 1~50까지 할당되어 있습니다. 2의 배수이면 다음 반복으로 넘어가고 40 이상의 수는 print하지 않는 수를 구하시오.  (코드는 뒤쪽에)

 

 

-------------------------------------------------------------------------------------------------

# Exam1. for문을 이용하여 1~20 에서 3의 배수를 구하시오.
for(x in 1:20){
  if(x %% 3==0)
    print(x)
}

[1] 3
[1] 6
[1] 9
[1] 12
[1] 15
[1] 18


# Exam2. while문을 이용하여 1~20 에서 2의 배수를 구하시오.
x <- 1
while(x<=20){
  if(x %% 2 ==0){
    print(x)
  }
  x <- x+1
}

# Exam3. 변수 x에 1~50까지 할당되어 있습니다. 6의 배수이면 다음 반복으로 넘어가고 40 이상의 수는 print하지 않는 수를 구하시오. 

for(x in 1:50){
  if(x %% 6!=0){
    next
  }
  else if(x>=40){
    break
  }
  print(x)
}


[1] 6
[1] 12
[1] 18
[1] 24
[1] 30
[1] 36

 

개인적으로 특수한 경우를 제외하곤 for문을 자주 쓰는데, 가독성이 뛰어나고 코드를 명확하게 파악할 수 있기 때문입니다. 아무래도 while문은 반복 횟수가 지정되어 있지 않기 때문에 직관적으로 쓰기엔 for문보다 코드를 한눈에 파악하기 쉽지 않습니다. 하지만 내용 자체가 어려운 편은 아니라서 상황에 맞게 적절하게 쓰면 됩니다.

 

 

 

 

반응형