gpt4 book ai didi

r - tbl_df 在 S4 类中转换为列表

转载 作者:行者123 更新时间:2023-12-02 00:59:17 26 4
gpt4 key购买 nike

当我尝试在 S4 类中使用 tbl_df 时,tbl_df 插槽似乎被转换为 list

library('tibble')
setOldClass(c('tbl_df', 'tbl', 'data.frame'))
setClass(Class = 'TestClass', slots = c(name = 'character'), contains = 'tbl_df')

tmp1 <- new('TestClass', tibble(x = 1:5, y = 1, z = x ^ 2 + y), name = 'firsttest')
tmp1@.Data
[[1]]
[1] 1 2 3 4 5

[[2]]
[1] 1 1 1 1 1

[[3]]
[1] 2 5 10 17 26

我可以像访问 tbl_df 对象一样访问 tmp1@.Data 吗?喜欢

tmp1@.Data
# A tibble: 5 x 3
x y z
* <int> <dbl> <dbl>
1 1 1 2
2 2 1 5
3 3 1 10
4 4 1 17
5 5 1 26

最佳答案

S3 对象,只是为了简化,是具有特殊属性“类”的列表,用于调用正确的通用函数。 print 是一个通用函数,在 R 输出 tibble 对象时被调用。

library(tibble)
tb <- tibble(x = 1:5, y = 1, z = x ^ 2 + y)

dput(tb)
#structure(list(x = 1:5, y = c(1, 1, 1, 1, 1), z = c(2, 5, 10,
#17, 26)), row.names = c(NA, -5L), class = c("tbl_df", "tbl",
#"data.frame"))

attributes(tb)
#$`names`
#[1] "x" "y" "z"
#
#$row.names
#[1] 1 2 3 4 5
#
#$class
#[1] "tbl_df" "tbl" "data.frame"

当您使用 S3 父类创建 S4 类时,R 仅将列表存储在 .Data 槽中。 R 仍然保留 S3 对象的属性,但不在 .Data 槽中。当您打印 TestClass 时,您会得到 tibble 输出和 S4 槽。如果只需要 S3 对象,您可以使用 as(object,"S3")

setOldClass(c('tbl_df', 'tbl', 'data.frame'))
setClass(Class = 'TestClass', slots = c(name = 'character'), contains = 'tbl_df')
tmp1 <- new('TestClass', tibble(x = 1:5, y = 1, z = x ^ 2 + y), name = 'firsttest1')
tmp1
#Object of class "TestClass"
## A tibble: 5 x 3
# x y z
#* <int> <dbl> <dbl>
#1 1 1 2
#2 2 1 5
#3 3 1 10
#4 4 1 17
#5 5 1 26
#Slot "name":
#[1] "firsttest1"

attributes(tmp1)
#$`names`
#[1] "x" "y" "z"
#
#$row.names
#[1] 1 2 3 4 5
#
#$.S3Class
#[1] "tbl_df" "tbl" "data.frame"
#
#$name
#[1] "firsttest1"
#
#$class
#[1] "TestClass"
#attr(,"package")
#[1] ".GlobalEnv"

as(tmp1,"S3")
## A tibble: 5 x 3
# x y z
#* <int> <dbl> <dbl>
#1 1 1 2
#2 2 1 5
#3 3 1 10
#4 4 1 17
#5 5 1 26

关于r - tbl_df 在 S4 类中转换为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51825456/

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