使用蜡笔格式的字符串时如何获得准确的字符数?

How can I get an accurate character count when using crayon-formatted strings?

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

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

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

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

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

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

r = red('1234')
dput(r)
# "3[31m12343[39m"
class(r)
# [1] "character"

看起来乱码的部分(3[31m3[39m)就是所谓的 ANSI escape codes——您可以在这里将其视为 "start red" 和 "stop red"。虽然在您的终端中将字符对象转换为打印字符的程序知道并翻译这些,但 nchar 不是。 nchar实际上看到14个字符:

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

为了得到我们想要的 4,crayon 提供了一个辅助函数:col_nchar 它首先应用 strip_style 来去除 ANSI 标记,然后运行普通的 nchar:

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

因此,如果您觉得更易读,可以自己 nchar(strip_style(x)),或者使用 col_nchar