Быстрый и грязный хак
Вы можете переопределить метод print.tbl
, чтобы сделать что-то свое, а затем вызвать функцию tibble:::print.tbl
:
library(tidyverse)
as.time <- function(x){
class(x)<-"time"
x
}
is.time <- function(x) "time" %in% class(x)
res <- tribble(~a,~time,
"a",123,
"b",234,
"c",456
) %>% mutate(time = as.time(time))
print.tbl <- function(x, ...){
res <- mutate_if(x, is.time, ~ .x / 60)
tibble:::print.tbl(res, ...)
}
res
#> # A tibble: 3 x 2
#> a time
#> <chr> <dbl>
#> 1 a 2.05
#> 2 b 3.9
#> 3 c 7.6
# Or if you want to make it ok for CRAN
print.tbl <- function(x, ...){
res <- mutate_if(x, is.time, ~ .x / 60)
print_tbl <- getFromNamespace("print.tbl", "tibble")
print_tbl(res, ...)
}
res
#> # A tibble: 3 x 2
#> a time
#> <chr> <dbl>
#> 1 a 2.05
#> 2 b 3.9
#> 3 c 7.6
Создано в 2019-02-07 представьте пакет (v0.2.1)
Редактировать: правильный способ сделать это
Вам необходимо определить несколько методов: print
& format
, pillar_shaft
и type_sum
.
library(tibble)
library(pillar)
time <- function(x) {
as_time(x)
}
as_time <- function(x) {
structure(x, class = "time")
}
c.time <- function(x, ...) {
as_time(NextMethod())
}
`[.time` <- function(x, i) {
as_time(NextMethod())
}
format.time <- function(x, ...) {
ret <- unclass(x / 60)
format(ret)
}
print.time <- function(x, ...) {
cat(format(x), sep = "\n")
invisible(x)
}
time(360)
#> 6
type_sum.time <- function(x) {
"time"
}
pillar_shaft.time <- function(x, ...) {
out <- format(x)
pillar::new_pillar_shaft_simple(out)
}
data <- tibble(
loc = time(360)
)
data
#> # A tibble: 1 x 1
#> loc
#> <time>
#> 1 6
Создано в 2019-02-07 пакетом prex (v0.2.1)
См. Дополнительную информацию: https://cran.r -project.org / web / packages / tibble / vignettes / extending.html