在 tidyverse 中,class "tbl" 的 object 和 "tbl_df" 有什么区别?

In the tidyverse, what is the difference between an object of class "tbl" and "tbl_df"?

创建小标题时,

tbl <- tibble(A=1:5, B=6:10)

的结果
class(tbl)

[1] "tbl_df"     "tbl"        "data.frame"

我经常看到这个,因为我经常使用 dplyr。但是什么时候 object 只是 "tbl"(而不是 "tbl_df"),反之亦然?如果有的话,我只想知道更多关于差异的信息。

任何文件将不胜感激!

您可以将 "tibble" 视为一个接口。如果一个对象可以响应所有的 tibble 动作,那么你可以认为它是一个 tibble。 R 没有强类型。

所以 tbl 是通用的 tibble,而 tbl_df 是一种特定类型的 tibble,它基本上将其数据存储在 data.frame.

还有像 dtplyr 这样的其他软件包,它们允许您像 tibble 一样工作,但将数据存储在 data.table 中。例如

library(dtplyr)
ds <- tbl_dt(mtcars)
class(ds)
# [1] "tbl_dt"     "tbl"        "data.table" "data.frame"

还有 dbplyr 包,它允许您使用 SQL 数据库后端。例如

library(dplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, mtcars, "mtcars",temporary = FALSE)
cars_db <- tbl(con, "mtcars")
class(cars_db)
# [1] "tbl_dbi"  "tbl_sql"  "tbl_lazy" "tbl"  

所以我们再次看到这个东西通常可以充当 tibble,但它还有其他 类 在那里,这样它就可以尝试在数据库引擎中完成所有工作,而不是操纵R本身的数据。

所以 tbltbl_df 之间并没有真正的 "difference"。后者只是说明 tibble 实际上是如何实现的,因此行为可能会有所不同(更优化)。

更多信息,您可以查看tibble vignette or the extending tibble vignette