использовать личный метод печати внутри print.tbl - PullRequest
0 голосов
/ 07 февраля 2019

Я создал класс с именем time.Это фиктивный пример, который возвращает секунды как минуты.Это хорошо работает, но функция print.time не используется внутри таблицы.

Есть идеи, как я могу адаптировать дисплей внутри таблицы?

С уважением

см. Репрезентациюздесь

library(dplyr)
#> 
#> Attachement du package : 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
as.time <- function(x){
  class(x)<-"time"
  x
}
print.time<-function(x,...){
  print.default(unclass(x/60)) 
  invisible(x)
}


60 %>% as.time() %>% print()
#> [1] 1


tribble(~a,~time,
        "a",123,
        "b",234,
        "c",456
) %>% mutate(time = as.time(time))
#> # A tibble: 3 x 2
#>   a      time
#>   <chr> <dbl>
#> 1 a       123
#> 2 b       234
#> 3 c       456

Создано в 2019-02-07 пакетом представить (v0.2.1)

1 Ответ

0 голосов
/ 07 февраля 2019

Быстрый и грязный хак

Вы можете переопределить метод 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

...