9

人们常说data.frame继承自,考虑到访问 data.frame 列( 、等)list的许多常见范例,这是有道理的。$sapply

Yet"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"

取消分类 adata.frame表明它是一个列表:

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

如果没有 data.frame 方法,测试它看起来会优先调用默认方法而不是 list 方法:

> 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.frames 视为列表的函数如何知道将它们视为列表?从外观上看,lapply它似乎很快就进入了 C 内部代码,所以也许就是这样,但我的想法在这里有点震惊。
4

1 回答 1

1

我承认 R 中的类也让我有些困惑。但我记得曾经读过类似“In 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 回答