型の優先順位
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"
論理値 = 因子 < 整数 < 数値 < 文字
っていう力関係のようだ。
慣れてくれば、この副作用を利用してコーディングが楽になる。
でも、ちょっとだけね。