【问题标题】:underline column names in RR中的下划线列名
【发布时间】:2020-06-18 03:03:56
【问题描述】:

如何在 R 中为列名加下划线?

我尝试保存一个字符串,然后将其与

一起使用
library(crayon)

string1 <- underline("hello")
string2 <- underline("hello2")

colnames(table) <- c(string1, string2)

但是 string1 打印为 "\033[4mhello\033[24m"

String2 打印为 "\033[4mhello2\033[24m"

请告诉我如何让列名加下划线。

我只想让列名脱颖而出,即使在打印到控制台时更改文本的颜色也可以

【问题讨论】:

  • 你用什么包来实现“下划线”功能?
  • 蜡笔包。我只想在数据框中的列名下划线,因为它不容易找到
  • 也许看看 DT,knitr 包?
  • 那里没有任何用处。即使改变文本的颜色也会很好。似乎在任何地方都找不到任何东西。

标签: r string dataframe crayon


【解决方案1】:

矩阵和 data.frames 的默认打印代码在内部处理不可打印的字符,并将它们转义。这就是为什么 ANSI 转义字符 code'\033' 被转义为 `'\033',而不是直接打印的原因。

如果您不想要这个,您将不得不编写自己的 print.data.frame 函数 similar to how tibble does this。正确地执行此操作需要相当多的逻辑(因此也需要代码)。不过你可以作弊:

print.data.frame = function (x, ...) {
    output = capture.output(base::print.data.frame(x, ...))
    colnames = crayon::underline(colnames(x))
    regmatches(output[1L], gregexpr('\\S+', output[1L]))[[1L]] = colnames
    cat(output, sep = '\n')
}

捕获标准print.data.frame 输出,并将第一行(= 列标题)替换为下划线格式的版本。

(请注意,如果您的列名中有空格,上述代码将失败。)

【讨论】:

  • 我已经放弃了让这段代码变得健壮:在一般情况下为任意列名修复它会使代码变得更加复杂:曾经必须在 output[1L] 中搜索实际的列名.但是一个简单的regexpr 搜索(或等效的)是不够的,因为列名可能包含彼此(例如colnames = c('foobar', 'foo'))。要找到正确的位置,需要逐步截断前缀,或者构建更复杂的正则表达式来一次捕获所有列标题。
最近更新 更多