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
その後、件の
つの質問:
data.frame
を持っているために失敗は正式にlist
から継承しない設計の観点から任意の利点がありますか?data.frame
をリストとして扱うような関数は、それらをリストとして扱う方法をどのように知っていますか?lapply
を見ると、Cの内部コードがかなり速くなっているように見えるので、おそらくそれですが、私の心はここで少し吹きました。
私はそれが効率に沸く推測:
また、各列は、実際のベクトルであることを確認することができます。 S3メソッドのディスパッチはコストがかかり、リストはRの非常に基本的なデータ構造です。したがって、Cレベルで扱われます。たとえば、 'is.list'はプリミティブです(is.data.frameとは異なります)。 – Roland
'list'の' data.frame' _inherits_が間違っていると言う人は間違っています。彼らがおそらく意味するのは、data.framesは特定の属性と特性を持つリストとして実装されているということです。 'lapply'は、' X'がベクトルでない場合、 'is.object'が' TRUE'(基本的に 'class'属性がある場合)であれば' as.list'を呼び出します。 'as.list'は' data.frame'メソッドで一般的です。 –
これについては、http://adv-r.had.co.nz/OO-essentials.html#method-dispatchで少し説明します。 @JoshuaUlrich data.frameはリストから継承しているとは言っても過言ではないと思いますが、リストとデータフレームが同じオブジェクトシステムに属していないので複雑です。 – hadley