[03-2] R언어 - type와 mode 차이의 이해

Language/R 2017.11.07 19:08 posted by TechNote.kr


R언어를 공부하면서 가장 헷갈렸던 부분 중에 하나가 아닐까 한다. 


object는 뭐고, mode는 또 뭐고, type은 또 무엇이란 말인가?


결론적으로 말하면 object는 R언어에서 다루는 하나의 entity(개체)이고, 이 object가 memory에 올라갈 때의 형식이 type 혹은 mode로 표현된다. 즉, 모든 object는 type과 mode 값을 가지고 있다. 


그렇다면 type과 mode의 차이는 무엇인가?


먼저, type은 R언어 자체에서 사용하는 분류이다. 


R언어는 C언어를 이용해 코딩되었는데, 이 C언어 상에서 실제적으로 서로 구분하는 type을 나타낸다. 


반면 mode는 "Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole." 이 정의한 분류 방법으로, 다른 S language 와 호환성을 가지고 있는 것이 특징이다. 


이와 같이 object를 분류하는 방법이 추가로 생기게 된 이유는 R 언어가 지속적으로 긴 시간 개량되어 왔기 때문이라고 한다. 


mode는 old style의 분류 방법이고, typeof 로 확인할 수 있는 type이 보다 정확한 방법의 분류이다. 




type (typeof)



type은 typeof function을 통해 확인이 가능하다. 


"logical" a vector containing logical values
"integer" a vector containing integer values
"double" a vector containing real values
"complex" a vector containing complex values
"character" a vector containing character values
"raw" a vector containing bytes
"list" a list
"NULL" NULL
"closure" a function
"special" an internal function that does not evaluate its arguments
"builtin" an internal function that evaluates its arguments
"environment" an environment
"S4" an S4 object which is not a simple object


user level에서 잘 사용되지 않지만 아래 type들도 존재한다.


"symbol" a variable name
"pairlist" a pairlist object (mainly internal)
"promise" an object used to implement lazy evaluation
"language" an R language construct
"char" a ‘scalar’ string object (internal only) ***
"..." the special variable length argument ***
"any" a special type that matches all types: there are no objects of this type
"expression" an expression object
"bytecode" byte code (internal only) ***
"externalptr" an external pointer object
"weakref" a weak reference object




mode


mode와 type의 분류는 거의 일치한다. 

하지만 몇가지 다른 분류가 있는데 그 차이는 다음과 같다. 



types "integer" and "double" are returned as "numeric".

types "special" and "builtin" are returned as "function".

type "symbol" is called mode "name".

type "language" is returned as "(" or "call".




mode 사용의 예)


numeric (숫자)


R언어는 숫자 표현에 있어 double을 기본으로 하고 있다. type에는 integer과 double이 있지만 numeric이라고 표현되어 있는 곳은 double이라고 바꿔도 동일한 의미라고 보면 된다. R console내 help(numeric)를 해보면 아래와 같이 기술되어 있다. 

numeric is identical to double (and real). It creates a double-precision vector of the specified length with each element equal to 0.
반대로 help(double)을 해보면 다음과 같이 기술되어 있다. 

double creates a double-precision vector of the specified length. The elements of the vector are all equal to 0. It is identical to numeric.


numeric의 예)

> number=10
> number
[1] 10
> mode(number)
[1] "numeric"
> is.numeric(number)
[1] TRUE



※ R언어의 type에 integer도 있긴하다 help(integer)를 해보면 그 용도는 다음과 같다.

Integer vectors exist so that data can be passed to C or Fortran code which expects them, and so that (small) integer data can be represented exactly and compactly.


Integer type의 경우 존재하긴 하지만 C나 Fortran과 연동을 위해 주로 사용된다. 



character (문자)


 C언어에서는 character라고 하면 문자 하나만을 의미한다. 반면 R언어에서는 문자열 또한 character라고 표현한다. 다른 언어와 마찬가지로 큰따옴표(")나 작은따옴표(')를 이용해 정의한다. 

character의 예)
> ch = "Hello"
> ch
[1] "Hello"
> mode(ch)
[1] "character"
> is.character(ch)
[1] TRUE



logical (논리, TRUE/FALSE) 


 일반적으로 조건문에서 사용 가능한 mode이다. TRUE와 FALSE, 두 값 중 하나를 갖는다. 혹시라도 큰따옴표(")나 작은따옴표(')와 함께 쓰인다면 character로 인식되기 때문에 주의해야 한다. 

logical의 예)
> lo = TRUE
> lo
[1] TRUE
> mode(lo)
[1] "logical"
> is.logical(lo)
[1] TRUE



complex (복소수) 


 예를 들어 1+5i 와 같은 복소수를 표현하기 위한 mode이다.

complex의 예)
> co = 1+5i
> co
[1] 1+5i
> mode(co)
[1] "complex"
> is.complex(co)
[1] TRUE



raw


값의 raw byte를 표현하기 위한 mode이다. 


raw의 예)

> ra = charToRaw("Hello")
> ra
[1] 48 65 6c 6c 6f
> mode(ra)
[1] "raw"
> is.raw(ra)
[1] TRUE




mode간 변환


잘못된 연산의 예)

> "3" + "5"
Error in "3" + "5" : non-numeric argument to binary operator



당연한 이야기이겠지만 위와 같이 mode가 character 인 경우 사칙 연산이 불가능하다. 이와 같을 때는 mode를 바꾸어주어야 할 필요가 있다. 


mode 변환의 예)

> as.character(3)
[1] "3"
> as.numeric("3")
[1] 3
> as.logical("TRUE")
[1] TRUE



as.character function, as.numeric function, as.logical function을 이용해 위와 같이 mode간 전환이 가능하다. 




Reference


http://stat.ethz.ch/R-manual/R-devel/doc/manual/R-lang.html#Objects

https://stackoverflow.com/questions/6258004/types-and-classes-of-variables

https://stackoverflow.com/questions/8855589/a-comprehensive-survey-of-the-types-of-things-in-r-mode-and-class-and-type