gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:52:31 26 4
gpt4 key购买 nike

人们常说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内部代码,也许就是这样,但是我的想法有点不对劲。
  • 最佳答案

    我承认R中的类也让我有些困惑。但是我记得曾经读过诸如“在R数据中。帧实际上是向量列表”之类的东西。使用您示例中的代码,我们可以验证这一点:

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

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

    我们还可以验证每一列实际上是一个向量:
    > is.vector(dat$x)
    [1] TRUE

    关于r - 为什么class(data.frame(...))不显示列表继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19607652/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com