日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

型の優先順位

Rのオブジェクトには、論理値、因子、整数、数値、文字などがある。
これを型というらしいが、同じオブジェクトに異なる型を入れることはできない。
優先順位があって、文字列が一番強い。

> #x1は論理ベクトル
> (x1 <- c(TRUE,FALSE,TRUE))
[1]  TRUE FALSE  TRUE
> is(x1)
[1] "logical" "vector" 
> 
> #x2は因子ベクトル
> (x2 <- factor(1:4,labels=LETTERS[1:4],levels=1:4))
[1] A B C D
Levels: A B C D
> is(x2)
[1] "factor"   "integer"  "oldClass" "numeric"  "vector"  
> 
> #x3は整数ベクトル
> (x3 <- 1:4)
[1] 1 2 3 4
> is(x3)
[1] "integer"             "numeric"             "vector"             
[4] "data.frameRowLabels"
> 
> #x4は小数点を持つ、数値ベクトル
> (x4 <- c(1.1,1.2,1.3,1.4))
[1] 1.1 1.2 1.3 1.4
> is(x4)
[1] "numeric" "vector" 
> 
> #x5は文字ベクトル
> (x5 <- LETTERS[1:4])
[1] "A" "B" "C" "D"
> is(x5)
[1] "character"           "vector"              "data.frameRowLabels"
[4] "SuperClassMethod"   

こうやって、5種類の型について、別々のベクトルを準備して、関数c(combineということ)で繋いでみると

> #論理ベクトルと整数ベクトルからなるベクトルは、整数ベクトル
> str(c(x1,x3))
 int [1:7] 1 0 1 1 2 3 4
> 
> #因子ベクトルと整数ベクトルからなるベクトルは、整数ベクトル
> str(c(x2,x3))
 int [1:8] 1 2 3 4 1 2 3 4
> 
> #整数ベクトルと数値ベクトルからなるベクトルは、数値ベクトル
> str(c(x3,x4))
 num [1:8] 1 2 3 4 1.1 1.2 1.3 1.4
> 
> #数値ベクトルと文字ベクトルからなるベクトルは、文字ベクトル
> str(c(x4,x5))
 chr [1:8] "1.1" "1.2" "1.3" "1.4" "A" "B" "C" "D"

論理値 = 因子 < 整数 < 数値 < 文字
っていう力関係のようだ。

慣れてくれば、この副作用を利用してコーディングが楽になる。
でも、ちょっとだけね。