더북(TheBook)

5.1.1 객체 타입 알아보기

R에서는 모든 것을 객체라고 하지만, 객체에는 여러 가지 타입이 있다.

우리가 다룰 객체를 사용자가 직접 정의한다고 가정하자. 입력 객체의 타입에 따라 다른 방식으로 동작하는 함수를 만든다. 입력 객체가 원자 벡터(예를 들어 수치형 벡터나 문자형 벡터, 논리형 벡터)일 때는 첫 번째 요소를 반환하지만, 입력 객체가 데이터와 인덱스의 리스트일 때는 사용자 정의 요소를 반환하는 take_it 함수를 만들어야 한다고 하자.

예를 들어 입력이 c(1, 2, 3) 같은 수치형 벡터일 때, 함수는 첫 번째 요소인 1을 반환해야 한다. 입력이 c(“a”, “b”, “c”)이면 이 함수는 a를 반환해야 한다. 그러나 입력이 리스트(data = c(“a”, “b”, “c”), index = 3)라면 함수는 세 번째 요소(index = 3), 즉 c를 반환해야 한다.

이러한 함수를 만들려면 그 안에 들어갈 함수와 논리 흐름을 생각해야 한다. 첫째, 함수 결과가 입력 타입에 따라 다르므로 is.* 함수 중 하나를 사용하여 입력이 특정 타입인지 알아야 한다. 둘째, 함수가 입력 타입에 따라 다르게 동작하므로 논리를 분기하는 else 같은 조건부 표현식을 사용해야 한다. 마지막으로, 이 함수는 기본적으로 입력에서 요소를 추출해야 하기 때문에 요소 추출 연산자를 사용해야 한다. 이제 함수 구현이 좀 더 명확해졌다.

> take_it <- function(x) {
+     if (is.atomic(x)) {
+         x[[1]]
+     } else if (is.list(x)) {
+         x$data[[x$index]]
+     } else {
+         stop("Not supported input type")
+     }
+ }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.