如何在R中使用颜色打印数据框?

6
使用 crayon 软件包,可以创建彩色字符串:
library(crayon)
dat <- data.frame(X=c(yellow("foobar"), green("baz")), Y = cyan("qux"))

这里是编码后的 dat

> dat
                       X                   Y
1 \033[33mfoobar\033[39m \033[36mqux\033[39m
2    \033[32mbaz\033[39m \033[36mqux\033[39m

使用write.table函数可以得到带有颜色的表格:

enter image description here

但表格的对齐方式被破坏了。如何获得具有良好对齐的着色数据框呢?

colorDF包允许在数据框中设置颜色,但不允许按要求进行操作。我想要的是,在每个单元格中染成红色的一个单词,而不是整个单元格的染色。 colorDFdf_search函数接近我所需的功能,但它会将发现该模式的整个单元格都染色,而我只想染色一个单词。

例如,在这个数据框中:

#                                file line              code
# 1                        folder/f.R    1 f <- function(x){
# 2              folder/subfolder/g.R    1 g <- function(y){
# 3 folder/subfolder/subsubfolder/h.R    1 h <- function(z){

我希望代码列中的 function 单词以红色显示。

Miles McBain今天在Twitter上发布了有关{paint}包的内容(https://twitter.com/MilesMcBain/status/1421104940441907208?s=20) - 也许该包可以被改编以适应您的需求?或者也许colortable包可以起作用? - jared_mamrot
啊不,它会给整个单元格上色。 - Stéphane Laurent
1个回答

3

你可以使用 tibble 替代 data.frame,因为它允许漂亮地打印向量,参见 vignette("pillar", package = "vctrs")

特别地:

通过提供 format() 方法,您可以在 tibble 中基本控制向量的打印。

为了回答你的问题,你可以创建一个 function_red 类并扩展 character,参见 vignette("s3-vector", package = "vctrs")

library(vctrs)

data <- read.table(text="file line code
'folder/f.R' 1 'f <- function(x){'
'folder/subfolder/g.R' 1 'g <- function(y){'
'folder/subfolder/subsubfolder/h.R' 1 'h <- function(z){'
",header=T)

function_red <- function(x = character()) {
  vec_assert(x, character())
  new_vctr(x, class = "vctrs_function_red")
}

format.vctrs_function_red <- function(x,...) {
  gsub("function",crayon::red("function"),vec_data(x))
}

data$code <- function_red(data$code)
tibble::tibble(data)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接