使用蜡笔格式的字符串时如何获得准确的字符数?
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[31m
和 3[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
。
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[31m
和 3[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
。