r - 在 print.tbl 中使用个人打印方法
问题描述
我创建了一个名为time
. 这是一个将秒返回为分钟的虚拟示例。这很好用,但是在print.time
tbl 中没有使用该函数。
知道如何调整 tbl 内的显示吗?
问候
在这里看到reprex
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
由reprex 包(v0.2.1)于 2019 年 2 月 7 日创建
解决方案
快速而肮脏的黑客
您可以覆盖该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
由reprex 包(v0.2.1)于 2019 年 2 月 7 日创建
编辑:正确的方法
您需要定义几个方法: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
由reprex 包(v0.2.1)于 2019 年 2 月 7 日创建
有关更多信息,请参阅:https ://cran.r-project.org/web/packages/tibble/vignettes/extending.html
推荐阅读
- tensorflow - 将 Google AutoML tflite 模型从 quantized_uint8 转换为 float
- matrix - 将点从一个三角形变换到另一个三角形。3D版
- tsql - 从 OLAP Cube 中的 Measure 获取值并将其插入 SQL 表中
- python - Tkinter 获得点击帧
- api - 更新 Okta 应用程序
- python-3.x - 音乐队列,discord.py 音乐机器人
- javascript - 为什么在 js 中删除类对我不起作用?
- android - Flutter Dart - 屏幕关闭时隔离停止工作
- java - 如何使用 lambda 遍历嵌套的 Java 集合
- spring-boot - 几次 (3-4) 次运行后 Kubernetes Pod CPU 节流