R) 함수 사용하기

R) 함수 사용하기

R에는 함수가 어마어마하게 많다. 패키지가 15000개가 넘는데 그 안에 있는 함수는 얼마나 많을까? 아무튼 R 뿐만 아니라 코드를 작성한다면 반드시 알고 넘어가야 하는 것이 함수 관련 문법이다.

오바금지

함수도 사람이 만든 것이다. 함수명을 무작정 외우지 말자. 함수는 영어로 function. 기능을 뜻하는 이 단어를 곰곰히 생각해보자. 함수명은 보통 함수의 기능을 대표할 만한 단어 하나 또는 이니셜로 이름이 붙는다. 가끔 연관짓기 어려운 함수명이 있긴 하지만 되도록이면 함수명과 그 기능을 연관지어 이해하기 바란다.

예를 들어 head()라는 함수는 객체의 첫 원소 또는 행(row)부터 일부 원소 또는 행(row)을 추출하는 함수이다. 그리고 tail()은 마지막 원소 또는 행(row)부터 일부 원소 또는 행(row)을 추출하는 함수이다. 여기서 머리/꼬리로 연상해서 처음과 마지막을 연결지어 이해하면 훨씬 함수를 이해하기 쉽지 않을까 한다.

다음 예시는 data.table 패키지의 fread() 함수이다. 두 단어 이상을 축약해놓은 함수명으로 fast read 함수이다. 이 외에도 비슷한 함수명이 많으니 무작정 암기하지 말고 그 함수명을 찬찬히 뜯어보도록 하자.

문법

함수는 함수명, 소괄호, 인자, 쉼표(,), 인수가 있다. 전체적인 구조는 다음과 같다.

R 함수 구조

중학교 즈음에 함수를 배우면서 f(x)를 배운 기억이 있을텐데, 여기서 f는 함수명. x는 변수라고 기억할 것이다. 이게 조금 확장되었다고 보면 된다.

보다 쉬운 이해를 위해 좌표평면 위의 점 좌표를 보도록 하겠다.
좌표평면 위의 점 좌표
※ 출처: zum학습백과

점 P의 x축 위치와 y축 위치를 표기하기 위해서 P(3, 4)라고 표기하듯 함수에서 두 개 이상의 값을 구분해서 표기하기 위하여 쉼표를 활용한 값 구분을 한다.

인자의 표기

함수를 사용할 때 인자를 사용하는 경우가 있고 그렇지 않은 경우가 있다. 기본적으로 코드 함수 인자 명시 여부는 실행결과에 영향을 미치지 않는다. 하지만 문제는 사람한테서 발생한다. 왜냐하면 함수의 인자를 명시하지 않을 경우 어떤 값이 어느 인자에 할당되는지 빠르게 인지하기 어렵기 때문이다.

원소를 복제(replicate)하는 rep() 함수 예제를 보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
rep(1:3, 3) # 1
## [1] 1 2 3 1 2 3 1 2 3

rep(x = 1:3, 3) # 2
## [1] 1 2 3 1 2 3 1 2 3

rep( 1:3, times = 3) # 3
## [1] 1 2 3 1 2 3 1 2 3

rep(x = 1:3, times = 3) # 4
## [1] 1 2 3 1 2 3 1 2 3

1~4번 코드의 입력은 전부 다르지만 동작 결과는 모두 같다. 첫 번째 인자는 데이터를 받는 x, 두 번째 인자는 복제 횟수를 뜻하는 times 이다.
그런데 시간이 지나서 rep() 함수의 인자 순서를 까먹어서 다음과 같이 입력했다고 하자.

1
2
rep(3, 1:3)
## Error in rep(3, 1:3): 'times' 인자가 잘못되었습니다

이렇게 에러가 난다. 그럼 다음과 같이 입력해보자.

1
2
3
4
5
rep(times = 3, x = 1:3)
## [1] 1 2 3 1 2 3 1 2 3

rep(3, x = 1:3)
## [1] 1 2 3 1 2 3 1 2 3

멀쩡하게 동작하는 것을 알 수 있다. 이렇게 함수의 인자를 명시하게 되면 순서에 상관없이 잘 동작하기 때문에 조금은 귀찮더라도 되도록 함수 인자를 써주는 것을 권장한다.

살짝 눈치챈 사람이 있을지 모르겠으나 함수의 사용에서 인자를 명시하지 않을 경우 최초에 설계된 인자 순서대로 할당이 된다. 해당 순서는 각 함수의 도움말에 기록되어있는 순서를 보면 된다. 그럼 head()함수의 도움말을 보도록 하겠다.

help() 함수 도움말

잘 보면 head(x, n = 6L, ...) 이라고 적힌 것을 볼 수 있다. 인자 n의 경우 6L이 기본값으로 지정되어 있는데 이는 interger literal로 자동으로 실수로 변하지 않도록 정수라고 땅땅 명시해주는 것이 되겠다. 예를 들어 다음과 같이 입력하면 관련 내용을 엿볼 수 있다.

1
2
12.34L
## [1] 12.34

기본값 지정 등 보다 자세한 내용은 사용자 정의 함수 관련 포스팅에서 다룰 예정이다.

연산자도 함수다?

이 부분은 살짝 어려울 수 있다. 그런데 이해하려고 하지 말고 그냥 그러려니 하면 마음이 좀 편하지 않을까 한다. 우리가 덧셈을 한다면 다음과 같이 작성한다.

1
2
2 + 5
## [1] 7

(뭐 어쩌라고…)

앞의 코드를 다음과 같이 사용할 수 있다.

1
2
`+`(2, 5)
## [1] 7

!?!??

숫자를 더하는 기능의 함수를 사용하였고 첫 번째 인자로 2를, 두 번째 인자에 5를 넣은 것과 같다. 그럼 여기서 합리적 의심. 분명 연산자인줄 알았는데 함수처럼 된다면 과연 도움말을 호출 할 수 있을까??

된다.

다음과 같이 입력해보자.
※ 연산자를 키보드 숫자 1 버튼 왼쪽에 있는 역따옴표(`, back quotation)로 감싸면 된다.

1
?`+`

위 코드의 실행 결과는 다음과 같다.

더하기 연산자의 도움말

이제 연산자도 함수처럼 도움말을 조회할 수 있다는 것을 알았으니 다음 %in%같은 특수한 연산자도 조회할 수 있다는 것을 숙지하기 바란다.

연산자를 함수처럼 호출해서 사용할 수 있다는 것은몰라도 큰 문제는 없지만 나중에 tidyverse, dplyr, magrittr 패키지를 활용하여 코드를 작성하는 경우 사용하게될 파이프라인 연산자(%>%)를 보다 유연하게 사용할 수 있으니 참고하자.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×