2013-10-26 22 views
8

data.frameは、listから継承しているとよく言われています。これは、data.frameカラム($sapplyなど)にアクセスするための多くの共通のパラダイムを考えると意味があります。クラス(data.frame(...))がリストの継承を表示しないのはなぜですか?

dat <- data.frame(x=runif(100),y=runif(100),z=runif(100),g=as.factor(rep(letters[1:10],10))) 
> class(dat) 
[1] "data.frame" 

data.frameをUnclassingそれはリストだということを示しています:

> class(unclass(dat)) 
[1] "list" 

そして、それがどのように見えるんテスト

しかし"list"はない項目の中にはdata.frameオブジェクトのクラスリストで返されますdata.frameメソッドがない場合、デフォルトのメソッドはリストメソッドより優先して呼び出されます:

> f <- function(x) UseMethod('f') 
> f.default <- function(x) cat("Default") 
> f.list <- function(x) cat('List') 
> f(dat) 
Default 
> f.data.frame <- function(x) cat('DF') 
> f(dat) 
DF 
その後、件の

つの質問:

  1. data.frameを持っているために失敗は正式にlistから継承しない設計の観点から任意の利点がありますか?
  2. data.frameをリストとして扱うような関数は、それらをリストとして扱う方法をどのように知っていますか? lapplyを見ると、Cの内部コードがかなり速くなっているように見えるので、おそらくそれですが、私の心はここで少し吹きました。
+4

私はそれが効率に沸く推測:

> identical(dat$x, dat[[1]]) [1] TRUE 

また、各列は、実際のベクトルであることを確認することができます。 S3メソッドのディスパッチはコストがかかり、リストはRの非常に基本的なデータ構造です。したがって、Cレベルで扱われます。たとえば、 'is.list'はプリミティブです(is.data.frameとは異なります)。 – Roland

+4

'list'の' data.frame' _inherits_が間違っていると言う人は間違っています。彼らがおそらく意味するのは、data.framesは特定の属性と特性を持つリストとして実装されているということです。 'lapply'は、' X'がベクトルでない場合、 'is.object'が' TRUE'(基本的に 'class'属性がある場合)であれば' as.list'を呼び出します。 'as.list'は' data.frame'メソッドで一般的です。 –

+4

これについては、http://adv-r.had.co.nz/OO-essentials.html#method-dispatchで少し説明します。 @JoshuaUlrich data.frameはリストから継承しているとは言っても過言ではないと思いますが、リストとデータフレームが同じオブジェクトシステムに属していないので複雑です。 – hadley

答えて

1

私は、Rのクラスは私にもちょっと混乱していると告白します。しかし、私は "R data.framesは実際にベクトルのリスト"のようなものを一度読んで覚えています。 Rでリストの要素にアクセスするための通常の方法で、我々はまた、datの要素(列)にアクセスする[[]]演算子を使用することができます

> is.list(dat) 
[1] TRUE 
?is.list 

注:あなたの例からコードを使用して、我々はこれを確認することができます:

> is.vector(dat$x) 
[1] TRUE 
関連する問題