Во-первых, обратите внимание, что вывод 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
.