- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 R 数据包,它提供了一堆数据表对象。
当我的包的用户要求将这些数据表之一打印到控制台时,我希望它们能够像 tibbles 一样打印得漂亮,即很好地压缩,列类型位于顶部,并且有一些基本的着色数字等.
那么您知道如何为我的包中的数据表编写一个简单的 S3 方法吗?也许这已经在其他地方实现了,但我找不到它。
我知道还有一个与此类似的问题:Print pretty data.frames/tables to console ,@csgillespie 已经部分回答了这个问题,但他只留下了可以为 data.frames 编写 S3 方法的建议。但考虑到我想借用已经为 tibbles (tbl_df
) 开发的功能,是否有一种简单的机制可以从 {tibble}
包导入它,或者现在似乎最初在 {pillar}
包中实现了此功能?
顺便说一句:我不想简单地将数据表对象转换为 tibble,例如tibble::as_tibble()
因为这样我就失去了拥有数据表对象的优势。
在@Waldi的回答之后,我想到了一种替代方法,它只会漂亮地打印我的包提供的数据表,而不是加载我的包后的所有数据表。这是我的方法,希望得到您的反馈。
dt_tbl
添加到数据表中,换句话说,对其进行子类化:# Assume `dt` is one of the data tables provided by my package
class(dt) <- c('dt_tbl', class(dt))
“dt_tbl”
创建一个源文件:# In file print_dt_tbl.R
#' @keywords internal
print_dt_tbl <- function(x, ...) {
print_txt <- capture.output(print(tibble::as_tibble(x), ...))
print_txt[1] <- sub('tibble', 'data.table', print_txt[1])
cat(print_txt, sep = '\n')
invisible(x)
}
#' @export
print.dt_tbl <- function(x, ...) {
print_dt_tbl(x, ...)
}
> (iris_dt <- data.table::as.data.table(iris))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 5.1 3.5 1.4 0.2 setosa
2: 4.9 3.0 1.4 0.2 setosa
3: 4.7 3.2 1.3 0.2 setosa
4: 4.6 3.1 1.5 0.2 setosa
5: 5.0 3.6 1.4 0.2 setosa
---
146: 6.7 3.0 5.2 2.3 virginica
147: 6.3 2.5 5.0 1.9 virginica
148: 6.5 3.0 5.2 2.0 virginica
149: 6.2 3.4 5.4 2.3 virginica
150: 5.9 3.0 5.1 1.8 virginica
> class(iris_dt) <- c('dt_tbl', class(iris_dt))
> iris_dt
# A data.table: 150 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
# … with 140 more rows
最佳答案
您可以修改print.data.table
:
library(data.table)
print_as_tibble <- function(dt) print(tibble::as_tibble(dt))
assignInNamespace("print.data.table", print_as_tibble , ns="data.table")
dt <- as.data.table(mtcars)
dt
#> # A tibble: 32 x 11
#> 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
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
#> 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
#> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
#> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
#> # ... with 22 more rows
class(dt)
#> [1] "data.table" "data.frame"
要在您的包中使用此功能,您可以使用以下 .onLoad
创建一个 .R
文件:
.onLoad <- function(libname, pkgname) {
print_as_tibble <- function(dt) print(tibble::as_tibble(dt))
assignInNamespace("print.data.table", print_as_tibble , ns="data.table")
}
关于r - 如何使用同样漂亮的小标题打印来漂亮地打印数据表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68738066/
在通过REST Request Body方法发出搜索请求时,例如 GET /bank/_search { "query": { "match_all": {} }, "sort": [
有没有办法检测用户是否停止滑动?也许 bij 鼠标输入检查之类的。我尝试在 onSliderChange 事件中使用鼠标 isButton0Release 和 hasFocus 来检查用户是否停止滑动
(来源:google.com) 最近,我发现我的应用程序中显示的汉字相当难看。 我想我应该让它们“消除锯齿”。但是,我如何在 Java 中做到这一点? 仅供引用,我没有明确选择要在 GUI 应用程序中
我正在创建一个网站,根据某些条件(即是否登录、是否填写表格等),不同页面的外观可能会有很大差异。这使得需要在不同的时间输出不同的html block 。 但是,这样做会使我的 php 代码看起来很糟糕
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
如果我有一个类包含例如几个将用向量填充的槽,那么问题通常会出现。如果我想让这个类的对象或多或少透明,我会为它实现 print-object。在这里我遇到了问题: 如果我在一行中打印所有内容,REPL
我有一个允许上传到我网站的文件扩展名列表。 我用 jQuery Validation plugin 检查它们. 如果他们选择了不受支持的扩展程序,我会显示一条错误消息。 看起来像 var msg =
在一个本身嵌套在一个或多个父数组/结构/union 中的数组/结构/union 中读取多个数字/字符串的最佳方法是什么? 没有临时变量的第一个例子: printf("%d %d\n", a[9][3]
我是 AngularJS 的新手。我目前在为我的观点编写漂亮的 url 时遇到问题。我已经设置了 $locationProvider.html5Mode(true);删除 #从地址栏中显示的网址。但是
我有一个带有 ElasticSearch 的自动完成 jquery 功能。输入第一个字母时出现以下错误。 跨源请求被阻止:同源策略不允许读取 http://localhost:9200/test12/
我是一名优秀的程序员,十分优秀!