R 프로그래밍 언어에서 사용자 정의 함수와 apply()
함수는 R의 핵심 기능 중 일부입니다. 이 두 기능은 데이터 처리와 변환 작업을 수행할 때 특히 유용합니다. 이 글에서는 사용자 정의 함수의 작성 방법부터, apply()
함수의 다양한 활용 방법까지 간략하게 살펴보겠습니다.
R 사용자 정의 함수 설명
R에서의 함수(Function)란?
R에서 함수는 특정 작업을 수행하기 위한 코드 블록입니다. 사용자는 함수를 호출하여 해당 작업을 반복적으로 수행할 수 있습니다. R은 많은 내장 함수를 제공하지만 사용자는 필요에 따라 자신만의 함수를 정의할 수 있습니다.
R 함수를 구성하는 요소
R
은 C
, C++
, Python
, Perl
과 같은 블록 구조 (block-structured) 프로그래밍 언어 중 하나입니다. 이러한 언어들의 코드는 다음과 같은 특징들을 가지고 있습니다.
{}
를 사용하여 블록을 구분- 블록 안에 여러 개의 구문들 (statements) 이 존재
- 구문들은 줄 바꿈 혹은 세미 콜론
;
으로 구분
다음의 R 코드는 총 4개의 구문이 3줄에 걸쳐서 작성되었다고 볼 수 있습니다.
a <- 3
b <- 2
a; b # 2개 구문
## [1] 3
## [1] 2
R 함수는 블록 {}
안에 여러개의 구문들이 존재하고, 마지막에 결과값을 반환하는 구조로 되어있습니다. 좀 더 자세히 알아보도록 하죠.
R 사용자 정의 함수 만들기
이제까지 많은 R 함수를 사용해왔습니다. 이제는 나만의 R 사용자 정의 함수를 만들어서 사용해보도록 하겠습니다.
R 함수 만들기
R 함수는 function()
함수를 사용하여 정의합니다. 함수에 필요한 내용은 입력값이 무엇인지 알려주는 argument
와, 그리고 어떻게 작동하는지를 알려주는 body
부분으로 나눌 수 있습니다.
- 간단한 R 함수 구조
function_name <- function(input1, input2) {
result <- input + 1
return(result)
}
위 코드는 R에서 함수의 기본 구조를 보여주고 있습니다. 아래는 함수의 각 부분에 대한 설명입니다.
function_name
: 함수의 이름input1, input2
: 함수의 입력값, 매개변수(parameter)라고 부름.result
: 함수의 반환 값return
: 함수의 결과를 반환하는 키워드
R 함수 만들기 예제
다음은 두 숫자를 더하는 간단한 함수입니다. 두 숫자를 입력 받아서 더한 다음, 결과를 출력해주는 것을 확인 할 수 있습니다.
add_numbers <- function(a, b) {
result <- a + b
return(result)
}
add_numbers(3, 4)
## [1] 7
R 함수 기본 입력값 설정법
내가 만든 함수의 기본 입력값을 설정하여 사용하는 방법에 대하여 알아봅시다.
입력값 설정에 따른 함수 결과
함수의 입력값에 기본값이 설정이 안 된 경우를 생각해봅시다. 이 경우, 함수를 실행할 때 필요한 입력값을 넣지 않고 실행한다면 함수가 제대로 작동을 하지 않을 것 입니다.
g <- function(x) {
result <- x + 1
return(result)
}
g()
## Error in g(): argument "x" is missing, with no default
위의 코드에서는 함수 g()
의 입력값으로 설정된 x
의 값을 받아야 하는데, 아무런 값을 입력하지 않아서 에러가 발생하고 있습니다.
g <- function(x = 3) {
result <- x + 1
return(result)
}
g()
## [1] 4
위에 정의 된 함수 g()
는 입력값으로 아무것도 넣지 않아도, 기본으로 x
에 3이 입력되어 정상적으로 작동하는 것을 확인 할 수 있습니다.
R 코딩 스타일은 무엇일까?
각 언어에는 그 언어의 사용자들이 많이 사용하는 코딩 스타일이 존재합니다. R 언어에도 많은 스타일이 있지만 tidyverse
스타일 가이드를 많이 사용합니다. 아래는 함수에 관한 스타일 몇 가지를 가져왔으며, 자세한 사항은 tidyverse
스타일 가이드를 참고해주시기 바랍니다.
결과값 반환 함수 return()
R의 함수는 자동으로 마지막 구문을 결과값으로 반환하게 되어있습니다. 따라서 함수를 정의할 때, return()
함수는 결과가 맨 마지막에 반환되지 않을 때만 (early return의 경우) 사용을 권장합니다. 즉, “마지막에 return()
쓰지 말자!”가 주요 내용입니다.
# 좋은 예
find_abs <- function(x) {
if (x > 0) {
return(x)
}
-1 * x
}
# 나쁜 예
add_two <- function(x, y) {
return(x + y)
}
함수 이름 정할 때 유의사항
다음은 R 함수의 이름을 정할 때 많이 사용하는 규칙들 입니다.
- 변수와 함수 이름은 무조건 영어 소문자, 숫자, 그리고 밑줄
_
만을 사용합니다. (snake case 규칙) - 함수 이름에
.
사용하는 것은 지양합니다. 추후 배울 OOP를 사용해서 코딩을 할 때 혼란을 초래할 수 있기 때문입니다.
또한 함수나 변수 이름을 정할 때, 사용에 따라서
- 함수 이름의 경우 동사를 먼저 사용
- 변수 이름은 명사를 사용
위의 규칙을 사용해서 함수 이름을을 작성하는 예를 살펴보겠습니다.
# Good
add_two()
# Bad
AddTwo()
number_adder()
R apply 함수 이해하기
사각형 데이터 전용 반복문
apply()
함수는 행과 열이 있는 데이터를 사용하여 작업할 때 꼭 알고 있어야 하는 함수입니다. apply()
함수를 사용하면 반복문을 피하여 코딩을 할 수 있기 때문입니다. apply()
함수의 구문은 다음과 같습니다.
apply(object, direction, function, ...)
위 구문에서 object
는 행렬 또는 나타내는 객체입니다. direction
은 함수를 적용할 방향을 지정하는 인수입니다. direction
이 1인 경우 행(row) 방향으로 함수를 적용하고, direction
이 2인 경우 열(column) 방향으로 함수를 적용합니다.
- 1: 행 (row) 별 입력
- 2: 열 (column) 별 입력
function
은 적용할 함수를 지정하는 인수입니다. ...
은 function
함수에 전달할 추가적인 입력값을 설정할 수 있다는 뜻 입니다.
a <- matrix(1:12, nrow = 3, ncol = 4)
a
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
다음의 그림을 보면서 apply()
함수 적용방향에 따른 결과 값 이해해 봅시다.
apply(a, 1, max)
## [1] 10 11 12
apply(a, 2, max)
## [1] 3 6 9 12
R apply 사용자 정의 함수 적용하기
다음과 같은 사용자 정의 함수를 정의했다고 가정합니다.
my_f <- function(vec, const = 3){
max(vec)^2 + const
}
위의 my_f()
함수를 행렬 a
에 가로행 들에 적용해 보겠습니다.
apply(a, 1, my_f)
## [1] 103 124 147
my_f()
함수는 입력 값이 2개인 함수입니다. apply()
함수는 자동으로 입력값으로 들어오는 데이터의 행들 혹은 열들을 적용하는 함수의 첫 번째 입력값으로 넣어 줍니다. 다른 입력값을 바꿔서 적용하고 싶은 경우 apply()
함수에 따로 지정해주면 됩니다.
apply(a, 1, my_f, const = 5)
## [1] 105 126 149
위의 코드는 행렬 a
에 my_f()
함수를 적용하되, const
는 5를 지정해서 실행되는 것을 확인 할 수 있습니다.
본 포스팅은 R 프로그래밍 기초 공략.zip 교재의 일부분 입니다. 본 교재는 R을 독학하시는 분들을 위하여 특별히 제작된 교재입니다. R을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!