0. 개요
이번 포스팅에서는 함수(Function)에 대해 간단하게 작성하려고 합니다.
우선 5년 넘게 R을 사용하면서 여러 프로젝트 / 논문 / 분석을 진행해보면서 느끼는건데 파이썬보다 R에서 함수를 직접 작성할 일은 많이 없더라고요. 그래도 함수에 대해 아는 것은 중요하다고 생각이 듭니다.
우선 함수 작성을 하는 몇 가지 이점이 존재하는데 책에서는 다음과 같이 소개합니다.
1. 연상시키는 이름을 부여해 코드를 쉽게 이해할 수 있다.
2. 요구사항이 변경되면 함수 내부의 코드만 수정하면 된다.
3. 복사 + 붙여넣기 할 때보다 에러 발생할 가능성이 낮아진다.
즉, 함수는 반복할 일이 있거나(또는 미래에라도) 동작하는 프로그램의 일정 부분을 모듈화하여 각 기능의 unit test를 점검할 때 유용합니다.
1. 함수 작성
R에서는 다음과 같이 함수 작성을 진행합니다.
function_name <- function(arglist) expr
function_name에는 함수의 이름을 들어가고, arglist에는 선택적으로 1개 이상의 파라미터가 들어가게 됩니다. 또한 expr에서 함수 본문 코드를 작성하게 되는데 한 줄인 경우 이어서 바로 작성해도 되지만 두 줄 이상인 경우에는 중괄호를 이용해 단락 내부에서 작성할 수 있습니다.
2. 조건문
함수 내부에서는 유용하게 사용할 수 있는 조건부 실행의 종류에는 2가지가 있으며 각 설명의 생략합니다.
- 조건문 : if ~ else if ~ else 문
- 단락평가연산자(||, &&)와 조합하여 사용가능
- 논리형백터가 입력된 경우 any( ), all( ) 함수를 이용해 단일값으로 축소할 수 있다.
- 두 객체가 같은지 테스트할때 == 대신 identical을 사용해 논리형 스칼라 값을 반환하게 한다.
- 다중조건문 : switch(EXPR)
- 위치 또는 이름을 기반으로 선택한 코드를 평가 및 실행
3. 반복문
반복문에는 for(i in object), while(condition), repeat(expr) 함수를 사용할 수 있으며 자세한 설명은 생략합니다.
- for문 : 반복의 횟수가 정해져 있는 경우 유용
4. 오류제어
함수를 작성하다 보면 다양한 오류에 직면하게 되는데 이럴 때 사용할 수 있는 제어함수에 대해 알고 있으면 도움이 됩니다.
- stop("message") : 코드를 중단시키고 오류메시지 출력 (주로 조건문과 함께 사용)
- stopifnot(exprs) : 적어도 1개 이상의 expression이 참이 아닌경우 평가를 멈추며 에러메세지 출력
- warning("message") : 경고 메세지를 출력
- message("message") : 메세지 출력
{
stopifnot(2==3, 1>0)
a <- 5
}
{
stopifnot(2==2, 1>0)
b <- 5
}
print(a)
print(b)
- 첫번째 stopifnot에서 2==3이라는 표현은 참이 아니므로 a에 5가 할당되지 않습니다. (단락 내 코드 중단)
- 두번째 stopifnot에서 2==2와 1>0이라는 표현은 모두 참이므로 b에 5가 할당됩니다.
5. 함수에 유용한 함수
R에서 사용하면 좋은 함수들로 유용하게 사용할 수 있을 거라고 생각드네요!
- Sys.sleep(x) : x초가 지난뒤 실행되는 함수로 R에서는 주로 리소스 관리할 때 사용합니다(eg 크롤링)
- proc.time : R 시작후 사용자 및 시스템 시간 및 초과된 시간 출력
- ... : 함수의 파라미터로 사용되며 임의 개수의 입력을 받아 다른 함수로 전달할 때 사용
- invisible(object) : 해당 객체를 보이지 않게 반환
- assign("name", object) : name이라는 변수에 object 할당
- get("name") : 변수 name의 값을 반환
- missing(object) : 객체가 입력되었는지 판단하는 함수로 T/F를 반환
- match.arg(arg, choices) : 문자형 백터 arg가 choices에 존재하면 해당 choices 반환
- match.fun(FUN) : 문자형 벡터 FUN과 같은 이름의 함수를 주어진 환경에서 찾아 반환
- substitute : substituting and Quoting Expression
center <- function(x, type = c("mean", "median", "trimmed")) {
type <- match.arg(type)
switch(type,
mean = mean(x),
median = median(x),
trimmed = mean(x, trim = .1))
}
x <- rcauchy(10)
center(x, "t") # Works
center(x, "med") # Works
try(center(x, "m")) # Error
내용이 많아서 함수형(Functional)과 함수공장(Function Factory)은 다음 포스팅에서 다루겠습니다.
'Data Science > Manipulation' 카테고리의 다른 글
[Data Science With R] 14. 반복수행 with purrr (0) | 2023.04.18 |
---|---|
[Data Science With R] 13. 함수형(Functional) with Base and purrr (0) | 2023.04.16 |
[Data Science With R] 11. Time Data with lubridate (202406) (0) | 2023.04.08 |
[Data Science With R] 10. 범주형 데이터 조작 with forcats (202406) (0) | 2023.04.08 |
[Data Science With R] 9. 정규표현식(Regular Expression) with Stringr (202406) (0) | 2023.04.04 |