R : 함수

세양쥐·2022년 3월 8일
0

R

목록 보기
2/2
post-thumbnail

함수 (function)

R 환경에서 사용하는 모든 것은 객체이고, 실행하는 모든 것은 함수입니다. 또, R에서는 모든 함수도 객체입니다.

함수의 예시

◻ is.numeric() : 임의의 R 객체를 입력받아, 수치형 여부를 판단하는 논리 값(boolean)을 반환합니다.
◻ is.function() : 주어진 R 객체가 함수인지 판단합니다.

R에서 제공하는 기본 함수만으로 충분하지 않다면, 요구사항에 맞는 함수를 직접 작성해야겠죠?

함수 만들기

> add <- function(x,y) { x+y }
> add
function(x,y) {
x+y
}

함수 호출하기

> add(2,3)
[1] 5

동적 타이핑

R에서 함수는 입출력 형식(자료형, Type)에 엄격하지 않기 때문에 좀 더 유연합니다.
즉, 모든 벡터에 대하여 연산을 수행할 수 있어요.

> add(c(2,3),4)
[1] 6 7

> add(as.Date("2022-03-08"),1)
[1] "2022-03-09"

함수에 + 연산이 불가능한 인수가 입력되면 함수가 호출될 수 없습니다.

> add(list(a=1), list(a=2))
Error in x + y : non-numeric argument to binary operator

함수 일반화

함수란? 특정 문제를 푸는 논리 또는 프로세스 집합을 정의하여 추상화한 것입니다.
광범위한 경우에서 적용이 가능하도록 함수를 일반화하면 좋겠죠?

앞의 add() 함수를 사칙연산으로 일반화해봅니다.

> calc <- function(x, y, type) {
if(type == "add"){
x+y
} else if(type == "minus"){
x-y
} else if(type == "multiply"){
x*y
} else if(type == "divide"){
x/y
} else {
stop("Unknown type of operation")
}
}

함수 호출하기

calc(2, 3, "minus")
[1] -1
calc(c(2,5), c(3,6), "divide")
[1] 0.6666667 0.8333333
calc(as.Date("2022-03-08"), 5, "add")
[1] "2022-03-13"
calc(1,2, "nothing")
Error in calc(1, 2, "nothing") : Unknown type of operation

이때, type 인수가 다중으로 주어져도 계산할 수 있을까요?

calc(1,2,c("add", "minus"))
[1] 3
Warning message:
In if (type == "add") { :
the condition has length > 1 and only the first element will be used

오류가 발생했습니다. 여기서 type이 c("add", "minus") 로 주어지면 if(type==c(TRUE, FALSE))가 되기 때문에 조건문을 올바르게 처리할 수 없습니다.

> calc <- function(x, y, type) {
if(length(type) != 1L) stop("Only a single type is accepted")
if(type == "add"){
x+y
} else if(type == "minus"){
x-y
} else if(type == "multiply"){
x*y
} else if(type == "divide"){
x/y
} else {
stop("Unknown type of operation")
}
}

벡터 길이가 1인지 여부를 판별하는 조건문을 추가하여 예외처리를 명확히 하도록 합니다.

> calc(1,2,c("add", "minus"))
Error in calc(1, 2, c("add", "minus")) : Only a single type is accepted

함수 인수의 기본값

> increase <- function(x,y=1){
x+y
}

이렇게 인수의 기본값으로 y=1을 설정하면, increase() 함수는 x만으로도 호출이 가능합니다.

> increase(1)
[1] 2
> increase(c(1,2,3))
[1] 2 3 4

[참고자료 : 「R 교과서」, 쿤 렌, (주)도서출판길벗, 2020-04-29]

profile
세양쥐는 코딩하는 찍찍쥐

0개의 댓글