我正在尝试实现
tibble
的子类,它带有自定义打印方法。我认为 dplyr::group_by
默默地删除了我的自定义类,结果是我的 S3
打印方法不再调度。
当我认为这种行为是一个功能而不是一个错误时,我想知道处理这个问题的规范方法应该是什么?超载
dplyr::group_by
?或者我在这里忽略了一些非常基本的东西?
我的期望是分组的
my_tbl
也显示我的自定义标题:
library(tibble)
## Define a custom subclass of tbl
my_tbl <- function(x) {
new_tibble(x, class = "my_tbl")
}
## Define an own tbl_sum function
tbl_sum.my_tbl <- function(x) {
c("My Fancy Header" = "Whooaaaa!")
}
## Header is printed as it should
(mt <- my_tbl(mtcars %>% dplyr::slice(1L)))
# # My Fancy Header: Whooaaaa!
# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## However, not when we add a grouping structure
mt %>% dplyr::group_by(am)
# # A tibble: 1 × 11
# # Groups: am [1]
# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## Reason: group_by silently drops my custom class
class(mt) ##...vs...
# [1] "my_tbl" "tbl_df" "tbl" "data.frame"
class(mt %>% dplyr::group_by(am))
# [1] "grouped_df" "tbl_df" "tbl" "data.frame"
您需要自己为您的类实现一个
group_by()
方法。来自 dplyr 扩展小插图:
请注意,group_by() 和 ungroup() 不使用任何这些泛型,您需要直接为它们提供方法,或者依赖 .by 进行每个操作分组。