人们常说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
那么两个问题:
data.frame
从设计的角度来看,没有正式继承的失败list
有什么好处吗?- 那些似乎将
data.frame
s 视为列表的函数如何知道将它们视为列表?从外观上看,lapply
它似乎很快就进入了 C 内部代码,所以也许就是这样,但我的想法在这里有点震惊。