Как я могу получить точное количество символов при использовании строк в формате crayon? - PullRequest
0 голосов
/ 29 января 2020

crayon - это пакет для добавления цвета к выводу на печать, например,

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

sample colored text

Однако nchar используется на его выходе неправильно:

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

Я попробовал все различные варианты type= для nchar, но безрезультатно - как я могу получить R, чтобы сказать мне правильное количество символов в этой строке (4)

1 Ответ

0 голосов
/ 29 января 2020

Во-первых, обратите внимание, что вывод 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. разметка, затем запускается просто nchar:

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

Таким образом, вы можете сделать nchar(strip_style(x)) самостоятельно, если вы найдете это более читабельным, или использовать col_nchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...