[R] 함수의 이해
함수란 자주 사용되는 명령어들을 그룹화해서 생성한 재사용 가능 단위를 의미합니다. 어릴적 공부한 수학의 함수도 같은 의미로 이해할 수 있습니다.
#01. 수학에서의 함수
1) 일차 방정식 f(x)
일반적인 수학 식에서는 함수의 이름을 f
로 지정한다.
$f(x) = x + 5$
위의 수식에서 $x$가 5일 때 다음과 같다.
$y = f(5)$
$y = 10$
2) 함수의 이름을 hello
라고 지정한 경우
수학에서는 함수를 의미하는 function
을 줄여서 f
라고 표기하는 것일 뿐 함수의 이름이 반드시 f
여야 하는 것은 아니다.
$hello(a) = a + 5$
위의 수식에서 a가 5일 때 다음과 같다.
$y = hello(5)$
$y = 10$
즉, $f$라는 키워드나 $hello$라는 명령어로 설정된 수식을 재사용할 수 있다.
항목 | 설명 |
---|---|
$f$, $hello$ | 함수 이름 |
$x$, $a$ | 매개변수 혹은 파라미터. 함수가 동작하는데 필요한 조건값 |
$x + 5$, $a + 5$ | 함수의 수식 |
#02. 프로그램에서의 함수
1) 함수의 정의
function
이라는 예약어를 사용하여 코드 블록을 특정 명령어에 대입하는 개념이다.
함수를 정의하는 것 만으로는 어떠한 출력 결과도 만들어 내지 않는다.
구문형식
1
2
3
이름 <- function() {
... 명령어 ...
}
두 개의 메시지를 출력하는 함수 정의하기
1
2
3
4
say_hello <- function() {
print("Hello BigData")
print("안녕 빅데이터")
}
2) 준비된 함수 사용하기
함수의 이름을 명령어처럼 사용한다. 이를 “함수를 호출한다”고 한다.
1
2
say_hello()
say_hello()
💻 출력결과
1
2
3
4
[1] "Hello BigData"
[1] "안녕 빅데이터"
[1] "Hello BigData"
[1] "안녕 빅데이터"
#03. 함수의 파라미터
함수를 정의할 때 ()
안에 명시되는 조건값.
1) 파라미터를 사용하기
function
키워드 뒤의 괄호안에 필요한 조건값을 명시한다.
파라미터 정의하기
1
2
3
4
5
6
f1 <-function(x) {
y <- x + 1
tpl <- "f1(%d) => %d + 1 = %d"
result <- sprintf(tpl, x, x, y)
print(result)
}
파라미터를 포함한 함수의 호출
파라미터가 정의된 함수는 호출할 때 반드시 해당 값을 전달해야만 한다.
1
2
3
f1(2)
f1(5)
f1(7)
💻 출력결과
1
2
3
[1] "f1(2) => 2 + 1 = 3"
[1] "f1(5) => 5 + 1 = 6"
[1] "f1(7) => 7 + 1 = 8"
2) 다중 파라미터
다중 파라미터를 갖는 함수 정의하기
함수가 정해진 동작을 수행하는데 필요한 조건값이 두 개 이상인 경우 콤마(,
) 로 구분하여 정의한다.
1
2
3
4
5
6
f2 <-function(x, y) {
z <- x + y
tpl <- "f2(%d, %d) => %d + %d = %d"
result <- sprintf(tpl, x, y, x, y, z)
print(result)
}
다중 파라미터를 포함한 함수의 호출
다중 파라미터를 갖는 함수를 호출할 때는 콤마로 구분하여 조건값들을 전달할 수 있다.
1
2
3
f2(2, 1)
f2(5, 3)
f2(7, 5)
💻 출력결과
1
2
3
[1] "f2(2, 1) => 2 + 1 = 3"
[1] "f2(5, 3) => 5 + 3 = 8"
[1] "f2(7, 5) => 7 + 5 = 12"
3) 파라미터 기본값
함수를 정의하면서 마지막 파라미터부터 순차적으로 기본값을 정의할 수 있다.
기본값이 정의된 함수는 호출시에 해당 값을 생략 할 수 있다.
기본값을 갖는 파라미터를 포함하는 함수 정의
1
2
3
4
5
6
my_sum <- function(x, y, z=0) {
k <- x + y + z
tpl <- "sum(%d, %d, %d) -> + %d + %d + %d = %d"
result <- sprintf(tpl, x, y, z, x, y, z, k)
print(result)
}
모든 파라미터를 전달하며 호출하기
1
my_sum(3, 6, 9)
💻 출력결과
1
[1] "sum(3, 6, 9) -> + 3 + 6 + 9 = 18"
기본값이 정의된 파라미터를 생략한 경우
1
my_sum(100, 200)
💻 출력결과
1
[1] "sum(100, 200, 0) -> + 100 + 200 + 0 = 300"
#04. 리턴값(반환값)
함수가 자신의 처리 결과를 되돌려 주는 처리를 리턴이라고 하고 이 때 반환되는 값을 리턴값이라고 한다.
1) 결과값을 리턴(반환)하는 함수 정의하기
함수 안에서 return(값)
명령을 사용하여 자신이 호출된 위치로 결과값을 되돌려 주는 처리.
1
2
3
4
5
my_plus <- function(x, y) {
z <- x + y
# 자신이 호출된 위치로 값을 되돌려준다.
return(z)
}
2) 함수의 결과값 리턴받기
함수가 리턴하는 값을 다른 변수에 할당하거나 직접 출력하는데 사용할 수 있다.
함수의 리턴값을 다른 변수에 대입하기
1
2
a <- my_plus(10, 20)
print(a)
💻 출력결과
1
[1] 30
함수의 리턴값을 직접 출력하기
함수가 중첩되어 사용되는 경우 가장 안쪽의 함수가 먼저 실행된다.
1
print( my_plus(100, 200) ) # print(300)
💻 출력결과
1
[1] 300
함수의 처리 중단.
함수는 수행 도중 return(값)
명령을 만나면 그 즉시 수행을 중단한다.
주로 특정 조건이 충족되었을 때 함수의 실행을 중단하기 위해 사용되는 기법.
특정 조건에서 처리를 중단하는 함수 정의하기
1
2
3
4
5
6
7
8
foo <- function(x, y) {
if ( x < 10 || y < 10) {
return(0)
}
z <- x + y
return(z)
}
특정 조건에서 처리를 중단하는 함수 호출하기
1
2
print( foo(100, 200) )
print( foo(1, 2) )
💻 출력결과
1
2
[1] 300
[1] 0