首页 > 解决方案 > 使用蜡笔格式的字符串时如何获得准确的字符数?

问题描述

crayon是一个为打印输出添加颜色的包,例如

library(crayon)
message(red('blue'), green('green'), blue('red'))

示例彩色文本

但是,nchar在其输出上使用是错误的:

# should be 4 characters
nchar(red('1234'))
# [1] 14

我尝试了所有不同的type=选项nchar,但无济于事——我怎样才能让 R 告诉我这个字符串 (4) 中的正确字符数?

标签: rcrayon

解决方案


首先,请注意 的输出red只是一个普通字符串:

r = red('1234')
dput(r)
# "\033[31m1234\033[39m"
class(r)
# [1] "character"

看起来乱码的部分 (\033[31m\033[39m) 是所谓的ANSI 转义码——您可以在这里将其视为表示“红色开始”和“红色停止”的信号。虽然在终端中将字符对象转换为打印字符的程序知道并翻译了这些,nchar但不是。nchar实际上看到 14 个字符:

strsplit(r, NULL)[[1L]]
#  [1] "\033" "["    "3"    "1"    "m"    "1"    "2"    "3"    "4"    "\033" "["   
# [12] "3"    "9"    "m"

为了获得我们所追求的 4,crayon提供了一个辅助函数:col_nchar它首先适用strip_style于摆脱 ANSI 标记,然后运行 ​​plain nchar

strip_style(r)
# [1] "1234"
col_nchar(r)
# [1] 4

nchar(strip_style(x))因此,如果您发现它更具可读性,您可以自己动手,或者使用col_nchar.


推荐阅读