R 조건문
1. 의사결정 구조
1-1. 의사 결정(Decision Making)
R은 하나의 프로그래밍 환경으로, 의사결정 구조를 통하여 데이터의 형태에 따라 다양한 분기를 통한 처리를 하는 것이 중요하다. R에서는 if문, if~else문, switch문 등 다양한 문법을 통하여 의사결정 구조를 구현할 수 있도록 돕고 있다.
- 하나 이상의 조건을 평가(또는 테스트)하여 그 결과에 따라 다양한 흐름으로 명령문을 수행하는 구조 - R에서는 if문, if~else문, switch문을 제공 - 의사결정 구조의 용도 * if문 : 조건이 참일 때만 명령문을 수행 * if~else문 : 조건에 따라 별개의 명령문을 수행 * switch문 : 다양한 값의 조건에 따라 별개의 명령문을 수행 |
1) if 문
if문은 조건이 참인 경우에만 명령문을 수행하는 의사결정 구조문이다. 가장 단순한 의사결정 구조문이나, R로 다루는 모든 프로그램 로직의 골격을 이루고 있다.
- 특징
* 조건이 참(TRUE)인 경우에만 명령문 수행
* 가장 단순한 의사결정 구조
- 문법
if (조건) {
... # 조건이 참(TRUE)인 경우 수행하는 명령문
}
- 예시
x<-36L
if(is.integer(x)) {
print("x는 정수")
}
[1] "x는 정수"
2) if~else문
if~else문은 참일 뿐만 아니라 거짓인 경우에도 처리하는 구문을 추가한 의사결정 구조문 형태로, 분기를 나누어서 작업을 처리할 때 주로 사용된다.
- 특징
* 조건이 참(TRUE)인 경우와 거짓(FALSE)인 경우서로 다른 명령문을 수행하는 의사 결정 구조
- 문법
if (조건) {
... # 조건이 참(TRUE)인 경우 수행하는 명령문
} else {
... # 조건이 거짓(FALSE)인 경우 수행하는 명령문
}
- 예시
x<-3.14
if(is.integer(x)) {
print("x는 정수")
} else {
print("x는 정수가 아님")
}
[1] "x는 정수가 아님"
3) switch문
switch문은 조건에 따라 다양한 분기로 명령문을 실행하는 구조를 가지고 있다. 참과 거짓 이 아닌 값에 따른 다양한 분기를 가지는 의사결정 구조를 구현할 때 유용하다.
- 특징
* 조건이 일치하는 경우(case)의 명령문을 실행
* 조건이 다수로의 분기를 가질 때 유리
* 다른 프로그래밍 언어와 달리 기본값(default)이 없음
- 문법
switch(조건, case1, case2, ..., caseN)
- 예시
x <-"han"
switch(x, "kim" = "김", "lee" = "이", "han" = "한")
[1] "한"
2. 루프
인간이 컴퓨터를 사용하게 된 것은 단순반복적인 작업을 컴퓨터를 통하여 진행하고자 하는 것이 그 큰 목적 중 하나이다. 프로그래밍 환경인 R에는 그러한 철학을 이어받아 반복문(루프) 또한 존재하고 있다.
2-1. 루프(Loop)
특정한 명령문을 조건에 따라 여러 번 실행하고자 할 때 사용하는 구조
- repeat 루프 - while 루프 - for 루프 |
1) repeat 루프
repeat문은 무한히 반복하여 명령문을 실행하는 구조이다. if 및 break문을 이용하여 반복 구조에서 탈출할 수도 있다.
- 특징
* 무한히 반복하여 명령문을 실행하는 루프 구조
* if문과 break를 사용하여 반복에서 탈출할 수 있음
- 문법
repeat{
... # 반복하여 실행 할 명령문
}
- 예시
i <- 1
repeat {
i<-i+1
if(i==3) { # break문이 없는 경우
print(i) # 무한히 실행되므로
break # if문으로 탈출 조건 적용
}
}
[1] 3
2) while 루프
while문은 조건이 참인 경우에만 한정하여 동일한 명령문을 반복하여 실행하는 구조이다. 중간에 조건문의 조건이 바뀌게 되면 반복문을 탈출할 수도 있다.
- 특징
* 조건이 참이면 동일한 명령문을 다시 실행하는 루프
* 명령문의 실행 결과에 따라 조건이 거짓이 되면 반복문으로부터 탈출하는 것이 가능
- 문법
while (조건) {
... # 조건이 참(TRUE)이면 반복하여 실행할 명령문
}
- 예시
i<-1
while(i<3){ # i가 3 미만인 경우 무수히 반복
i<-i+1
}
i
[1] 3
3) for 루프
- 특징
* 벡터의 각 성분에 따라 반복하는 루프 구조
* 벡터 성분의 위치(index)에 일일히 접근하지 않으므로 벡터 성분별 명령문을 수행하는 구조일 때 유리
* 벡터 성분의 값을 대입하기 위한 변수 지정 필요
- 문법
for (value in vector) {
... # 각 성분별 실행할 명령문
}
- 예시
v<-c(2, 3, 5, 7,10)
s<-0
for(ve in v) {
s<-s+ve
}
print(s)
[1] 27
4) break 문
- 특징
* 현재 실행중인 루프문을 중단하고, 루프문 이후 명령문부터 실행하는 루프 제어 명령문
5) next문
- 특징
* 현재 실행중인 루프문을 중단하고, 루프문의 처음으로 되돌아가 명령문을 실행하도록 흐름을 제어하는 루프 제어 명령문
- 적용 방법
* if문 등을 이용하여 사용하는 것이 일반적
- 예시
v<-1:10
for(ve in v) {
if( ve%%2 ! = 0) { # %% : 나머지 연산자
next
}
print(ve)
}
[1] 2
[1] 4
[1] 6
[1] 8
[1] 10
3. 함수
3-1. 함수(function)
함수는 특정한 작업을 수행하는 명령문과 구조를 나열한 집합으로, 특히 사용자 정의 함수를 사용하여 사용자가 직접 자신만의 기능을 구현하여 활용할 수 있다.
- 정의 * 특정한 작업을 수행하는 명령문과 구조를 나열한 집합 - 기본 함수 (built-in functions) * R에서 기본으로 정의되어 있는 함수 - 사용자 정의 함수 (user defined functions) * 사용자가 자신의 목적에 맞게끔 함수명, 명령문,실행구조, 입력인자, 출력인자를 지정한 함수 |
1) 함수 호출 (Function Calling)
R에서의 함수 호출 문법과 예시는 다음과 같다. 함수를 호출할 때에는 입력인자가 있는 경우 입력인자를 순서대로 나열함으로써 함수에 입력인자의 값을 전달할 수 있다. 한편, R에서만의 특이한 문법으로, 함수 입력인자명을 지정함으로써 특정 입력인자를 할당하는 것이 가능하며, 이는 실제의 입력인자 순서와는 무관하게 지정 가능하다.
- 문법
<함수명>(<입력인자1>,<입력인자2>,...)
<함수명>(입력인자명1=<입력인자1>, 입력인자명2=<입력인자2>, ...)
- 예시
mean(c(88, 96, 92)) # mean과 c함수의 호출
png(file="result.png") #입력인자명을 지정하여 호출
2) 사용자 정의 함수 생성 문법
R에서는 사용자 정의 함수를 생성할 수 있다. 사용자 정의 함수를 생성하기 위해서는 function 키워드를 사용하여 함수를 생성할 수 있다. 이때, function 키워드로 생성한 함수를 함수명에 대입하는 형태로 정의할 수 있다. 한편, 입력인자명을 지정할 수도 있으며, 입력인자명을 지정할 때에는 “<입력인자명>=<입력인자>”와 같은 구조를 따른다.
사용자 정의 함수를 생성할 때에는 반드시 함수명, function 키워드, 중괄호 등을 포함하여야 하며, 선택요소는 입력인자, 출력인자, 입력인자명 등이다. 즉, 극단적으로는 입력인자, 출력인자, 입력인자명이 모두 없는 사용자 정의 함수도 존재할 수 있다.
<함수명><-function((입력인자명1=)<입력인자1>, ...){
... #함수가 호출되면 실행할 명령문 및 구조
}
- 구성요소
* 필수요소 : 함수명, function 키워드, 중괄호 등
* 선택요소 : 입력인자, 출력인자, 입력인자명 등
- 예시
myFunc<-function(v) { # v벡터를 받아 합산 결과를 반환하는
s<-0 # 사용자 정의 함수 myFunc()
for(ve in v) {
s<-s+v
}
return(s)
}
myFunc(c(2,3,7))
[1] 6 9 21