crayon
是一个为打印输出添加颜色的包,例如
library(crayon)
message(red('blue'), green('green'), blue('red'))
但是,nchar
在其输出上使用是错误的:
# should be 4 characters
nchar(red('1234'))
# [1] 14
我尝试了所有不同的type=
选项nchar
,但无济于事——我怎样才能让 R 告诉我这个字符串 (4) 中的正确字符数?
首先,请注意 的输出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
.