16.1 함수 정의

함수 작성의 기본 형식은 다음과 같습니다.

func_name <- function (argument) {
             statement
}

함수를 선언하는 데 예약어 function을 사용합니다. function 예약어 다음에 이 함수에서 사용할 인수들을 나열합니다. 그리고 중괄호 안의 블럭은 함수의 본문을 형성합니다. 본문에 명령문이 하나만 포함된 경우에는 중괄호를 생략할 수 있습니다. 이렇게 생성된 함수는 함수 개체를 나타내는 변수 func_name에 할당하여 함수의 이름이 지정됩니다.

x, y를 인수로 받아들여 x^y의 결과를 적당한 문자열로 반환하는 pow() 함수를 정의하고 이를 활용하는 예를 들어 보겠습니다.

# x, y 인수로 하여 x의 y 제곱을 구하는 pow() 함수를 정의합니다.
pow <- function(x, y) {                                      # 예약어 function으로 함수를 정의합니다.
       result <- x^y                                         # x^y를 result에 할당합니다.
       print(paste(x, "의", y, "제곱은", result, "입니다."))   # pow 함수의 최종 결과로 반환합니다.(문자열)
}

# pow() 함수를 사용합니다.
pow(3, 4)                                
## [1] "3 의 4 제곱은 81 입니다."

여기에서 우리는 pow()라는 함수를 만들었습니다. 이 함수는 두 개의 인수 x, y를 받아들여, xy 제곱을 계산한 다음, 이를 적절한 형식으로 인쇄하는 함수입니다. 이 함수는 문자열을 결합하는 데 사용되는 paste()를 사용하고 있습니다.

여기서 함수 선언에 사용된 xy 인수를 형식 인수(formal arguments)라고 하고, 함수를 호출하는 동안 사용되는 인수를 실제 인수(actual argements)라고합니다.

16.1.1 명명된 인수

위의 함수 호출에서 형식 인수와 실제 인수의 대응은 인수의 위치 순서대로 이루어 지게 됩니다. 즉, ’pow(8,2)’호출에서 형식 인수 xy에 각각 82가 할당되는 것입니다. 그런데, 명명된 인수(named arguments)를 사용하여 함수를 호출할 수도 있습니다.

이러한 명명된 인수로 함수를 호출할 때에는 실제 인수의 순서는 중요하지 않습니다. 예를 들어, 아래 주어진 모든 함수 호출은 동일합니다.

# 인수의 순서대로 함수를 호출합니다.
pow(8, 2)                               # pow() 함수를 호출할 때, 인수가 형식인수 순서대로 적용됩니다.
## [1] "8 의 2 제곱은 64 입니다."
# 명명된 인수를 이용하여 함수를 호출합니다.
pow(x = 8, y = 2)                       # pow() 함수를 호출할 때, 형식인수 x, y에 그대로 적용이 됩니다.
## [1] "8 의 2 제곱은 64 입니다."
pow(y = 2, x = 8)                       # pow() 함수를 호출할 때, 형식인수 x, y에 그대로 적용이 됩니다.
## [1] "8 의 2 제곱은 64 입니다."
                                        # 인수의 순서는 중요하지 않습니다.

또한 단일 함수의 호출에서 명명된 인수와 명명되지 않은 인수를 동시에 사용할 수도 있습니다. 이 경우 모든 명명된 인수를 형식 인수와 먼저 대응시킨다음, 명명되지 않은 인수를 형식 인수의 순서대로 대응시켜 적용시킵니다.

## 명명된 인수와 명명되지 않은 인수를 동시에 이용한 함수 호출입니다.
pow(x=8, 2)                             # x에 8을 먼저 대응시키고, 2는 나머지 인수 y에 적용시킵니다.
## [1] "8 의 2 제곱은 64 입니다."
pow(2, x=8)                             # 앞의 예와 동일합니다.  
## [1] "8 의 2 제곱은 64 입니다."