16.7 잘못된 인수 처리

다시 사용할 함수, 특히 함수 작성자가 아닌 다른 사람이 사용할 수 있는 함수의 경우 함수 내 인수의 유효성을 확인하는 것이 좋습니다. 이를 수행하는 한 가지 방법은stop() 함수를 사용하는 것입니다. 다음은 if()문을 사용하여 각 인수의 클래스가 숫자인지 확인합니다. 하나 이상의 인수가 숫자가 아니면 stop() 함수가 작동하여 사용자에게 의미 메시지를 제공할 것입니다.

# 미래 가치 벡터 : FV, 할인율 : r, 기간 : n을 인수로 현재 가치를 반환하는 PV 함수를 정의합니다.
PV <- function(FV, r, n) {
        if(!is.numeric(FV) | !is.numeric(r) | !is.numeric(n)){
                stop('This function only works for numeric inputs!\n', 
                     'You have provided objects of the following classes:\n', 
                     'FV: ', class(FV), '\n',
                     'r: ', class(r), '\n',
                     'n: ', class(n))
        }
        
        PV <- FV/(1+r)^n
        round(PV, 2)
}

# PV() 함수를 이용하여 현재 가치를 구합니다.
PV("1000", 0.08, "5")
## Error in PV("1000", 0.08, "5"): This function only works for numeric inputs!
## You have provided objects of the following classes:
## FV: character
## r: numeric
## n: character

또 다른 문제는 누락되거나 NA 값을 다루는 것입니다. 잠재적 미래 가치 벡터에 PV() 함수를 수행하고 싶다고 가정해 보겠습니다. 이 함수는 FV(future value, 미래 가치) 입력 벡터에서 누락된 값 대신 NA를 출력합니다. 누락된 값을 제거하려면 na.rm = TRUE인 경우 누락 된 값을 제거하기 위해 if문과 함께 함수 인수에 na.rm 인수를 통합 할 수 있습니다.

# NA를 포함하고 있는 미래 가치 입력 벡터입니다. 
fv <- c(800, 900, NA, 1100, NA)

# PV 함수를 호출합니다.
PV(fv, .08, 5)
## [1] 544.47 612.52     NA 748.64     NA
# PV 함수를 정의합니다.
PV <- function(FV, r, n, na.rm = FALSE) {
        if(!is.numeric(FV) | !is.numeric(r) | !is.numeric(n)){
                stop('This function only works for numeric inputs!\n', 
                     'You have provided objects of the following classes:\n', 
                     'FV: ', class(FV), '\n',
                     'r: ', class(r), '\n',
                     'n: ', class(n))
        }
        
        if(na.rm == TRUE) {                    # na.rm 인수를 처리합니다.
                FV <- FV[!is.na(FV)]
        }
        
        PV <- FV/(1+r)^n
        round(PV, 2)
}

PV(fv, 0.08, 5, na.rm = TRUE)
## [1] 544.47 612.52 748.64