为什么class(data.frame(...))不显示列表继承?

时间:2013-10-26 14:06:04

标签: r r-s3

通常会说data.frame继承自list,这对于访问data.frame列($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"

取消分类data.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.frame作为列表处理的函数如何知道将它们视为列表?从查看lapply看起来它很快就会转到C内部代码,所以也许就是这样,但我的思绪在这里有点夸张。

1 个答案:

答案 0 :(得分:1)

我承认R中的课程对我来说有点混乱。但我记得有一次读过“在R数据中。帧实际上是向量列表”。使用示例中的代码,我们可以验证:

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

请注意,我们也可以使用[[]]运算符来访问dat的元素(列),这是访问R中列表元素的常规方法:

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

我们还可以验证每列实际上是一个向量:

> is.vector(dat$x)
[1] TRUE