listって、かなり変わっている。でも便利。
エクセルっぽく言うと、一つのファイルに複数のワークシートがある感じ。
オブジェクトにオブジェクトをいろいろ放り込めます。
> x <- rep(1:3,each=2) # vector > y <- matrix(12:1,nrow=2,dimnames=list(1:2,LETTERS[1:6])) # matrix > z <- data.frame("x"=1:2,"y"=letters[1:2],"z"=factor(1:2)) # data.frame > (a <- list("x"=x,"y"=y, "z"=z, "a"="This is a list.")) $x [1] 1 1 2 2 3 3 $y A B C D E F 1 12 10 8 6 4 2 2 11 9 7 5 3 1 $z x y z 1 1 a 1 2 2 b 2 $a [1] "This is a list."
こんな風に、x はvector、y はmatrix、z はdata.frameの3種類を同じlistに放り込んでいます。
更に、オブジェクトaは文章(文字列)です。
データへのアクセスはdata.frameと同じようにnames属性を使ってアクセスできます。
> str(a) List of 4 $ x: int [1:6] 1 1 2 2 3 3 $ y: int [1:2, 1:6] 12 11 10 9 8 7 6 5 4 3 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:2] "1" "2" .. ..$ : chr [1:6] "A" "B" "C" "D" ... $ z:'data.frame': 2 obs. of 3 variables: ..$ x: int [1:2] 1 2 ..$ y: Factor w/ 2 levels "a","b": 1 2 ..$ z: Factor w/ 2 levels "1","2": 1 2 $ a: chr "This is a list." > names(a) [1] "x" "y" "z" "a" > a[1] # list の座標を指定する $x [1] 1 1 2 2 3 3 > a[[1]] # names属性がない場合の呼び出し [1] 1 1 2 2 3 3 > a$"x" # names 属性を指定しても良い [1] 1 1 2 2 3 3
オブジェクトを少なくできるので、ls()したときの見栄えが良いので重宝します。