r - 使用蜡笔格式的字符串时如何获得准确的字符数?
问题描述
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
.
推荐阅读
- json - 在模型中序列化列表并在 javascript 中反序列化
- java - 从 CMD 行运行时,JMeter 正在创建多个条目
- php - 如何修复 Visual Studio 代码中的扩展配置错误?
- python - 向所有应用程序日志添加唯一的请求 ID。Python
- java - 如何抑制其他应用程序的 F 键
- javascript - 使用字节数组创建 PDF 文件并下载/保存
- c# - 我如何编写自己的 ef 核心函数来操作数据库实体
- c# - 字符序列打乱了字符的顺序?
- azure-devops - 如何从代理处获取 PR 标题和描述
- javascript - HTML 页面在 Chrome 和 safari 中工作,但在 Internet explore 中不工作