Chapter 13 함수

반복되는 작업을 매번 복사-붙여넣기 하는 것은 매우 비효율적이며, 함수를 작성하여 사용할 경우 매우 효율적인 작업이 가능합니다.

13.1 함수의 요소

R에서 함수는 크게 3가지 요소로 구성됩니다.

  • body(): 함수 내부의 코드
  • formals(): 인자(argument) 내역
  • environment(): 함수의 변수에 대한 위치

예를 들어 금융 자산의 현재 가치는 다음과 같이 계산됩니다.

\[PV = FV / (1+r)^n\]

  • PV: 현재 가치
  • FV: 미래 가치
  • r: 할인률
  • n: 기간

이를 함수로 나타내면 다음과 같습니다.

PV = function(FV, r, n) {
  PV = FV / (1+r)^n
  round(PV, 2)
}

3가지 요소를 확인해보도록 하겠습니다.

body(PV)
## {
##     PV = FV/(1 + r)^n
##     round(PV, 2)
## }
formals(PV)
## $FV
## 
## 
## $r
## 
## 
## $n
environment(PV)
## <environment: R_GlobalEnv>

13.2 인자

PV() 함수는 여러 방법으로 실행할 수 있습니다.

PV(FV = 1000, r = 0.08, n = 5)
## [1] 680.6

모든 인자 리스트와 이에 대응되는 값을 입력합니다.

PV(1000, 0.08, 5)
## [1] 680.6

인자 리스트를 생략하면, 순서대로 값이 입력됩니다.

PV(r = 0.08, FV = 1000, n = 5)
## [1] 680.6

인자 내역을 순서대로 입력하지 않아도 됩니다.

PV(1000, 0.08)
## Error in PV(1000, 0.08): 기본값이 없는 인수 "n"가 누락되어 있습니다

PV() 함수에 필요한 인자는 3개인 반면, 2개만 입력하였으므로 에러가 발생합니다.

PV = function(FV = 1000, r = .08, n = 5) {
  PV = FV / (1 + r)^n
  round(PV, 2)
}

PV(1000, 0.08)
## [1] 680.6

만일 함수의 인자에 디폴트 값이 입력되어 있다면, 함수 실행시 이를 생략하여도 디폴트 값이 입력됩니다. 위 예제에서 n값이 디폴트 값인 5가 적용되었습니다.

13.3 다중 결과값 출력

동일한 함수를 여러값에 적용하기 위해서는 함수 내부에 c() 함수를 적용해야 합니다.

bad = function(x, y) {
  2 * x + y       # 1
  x + 2 * y       # 2
  2 * x + 2 * y   # 3  
  x / y           # 4
}

bad(1, 2)
## [1] 0.5

1, 2, 3, 4번 모든 연산에 대한 출력을 원하지만, 맨 마지막 연산값 만이 출력됩니다.

good = function(x, y) {
  output1 = 2 * x + y
  output2 = x + 2 * y
  output3 = 2 * x + 2 * y
  output4 = x / y
  c(output1, output2, output3, output4)
}

good(1, 2)
## [1] 4.0 5.0 6.0 0.5

모든 결과를 output*에 저장한 후 c() 함수를 통해 이를 묶어주면, 모든 연산값이 출력됩니다.