9

data.frameはから継承されているとよく言われますが、data.frame 列 ( 、など)listにアクセスするための多くの一般的なパラダイムを考えると、これは理にかなっています。$sapply

まだ、オブジェクト"list"のクラス リストで返されるアイテムの中にはありません。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"

a のクラスを解除するdata.frameと、それがリストであることを示します。

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

また、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

次に2つの質問:

  1. data.frame正式な継承の失敗はlist、設計の観点から何か利点がありますか?
  2. data.frames をリストとして扱っているように見える関数は、それらをリストとして扱うことをどのように知っているのでしょうか? これを見るlapplyと、C の内部コードにすぐに移行するように見えるので、おそらくそれだけですが、ここで少し頭がおかしくなりました。
4

1 に答える 1

1

正直なところ、R のクラスも少し混乱します。しかし、「R data.framesは実際にはベクトルのリストです」のようなものを読んだことを覚えています。例のコードを使用して、これを確認できます。

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

[[]]演算子を使用して の要素 (列) にアクセスすることもできますdat。これは、R でリストの要素にアクセスする通常の方法です。

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

各列が実際にベクトルであることも確認できます。

> is.vector(dat$x)
[1] TRUE
于 2014-02-21T23:26:52.760 に答える