通常会说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
然后有两个问题:
data.frame
未能正式继承list
是否有任何优势?data.frame
作为列表处理的函数如何知道将它们视为列表?从查看lapply
看起来它很快就会转到C内部代码,所以也许就是这样,但我的思绪在这里有点夸张。答案 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