#r #printing #tibble #sink #crayon
#r #печать #tibble #sink #карандаш
Вопрос:
У меня две машины с Windows. Обе Windows 10. Когда я запускаю следующий код для каждого, я получаю два очень разных вывода:
library(tibble)
sink(file.path(tempdir(), "test.log"), append = FALSE)
print(as_tibble(mtcars))
sink()
Одна машина выдает ожидаемый результат:
Другая машина выдает мне те же данные tibble, но, похоже, печатает все цветовые коды карандашей:
Сначала я подумал, что это должно быть из-за разницы в версии R или версии crayon. Но теперь я синхронизировал оба варианта R 4.0.3 и crayon 1.3.4. Версия Tibble — 3.0.4 для обоих. Не уверен, что проверять дальше. На второй машине изначально были более поздние версии всего. Но я максимально отклонился назад, и я все еще получаю цветовые коды.
У кого-нибудь есть какие-либо предложения о том, как это диагностировать?
Комментарии:
1. Эта проблема была исправлена в самом пакете crayon: github.com/r-lib/crayon/issues/120
Ответ №1:
Цвета регулируются пакетом карандашей. Вы можете запросить у этого пакета, сколько цветов поддерживается, например
> crayon::num_ansi_colors()
[1] 8
> crayon::has_color()
[1] TRUE
Существуют различные способы настройки количества цветов. Я бы сказал, что установка переменной среды является лучшей, потому что она также будет использоваться при параллельной обработке, если вы даже в конечном итоге используете это. Итак,
> Sys.setenv(R_CLI_NUM_COLORS = 2)
> crayon::num_ansi_colors()
[1] 2
> crayon::has_color()
[1] TRUE
Если вы установите для него значение одного цвета, то получите:
> Sys.setenv(R_CLI_NUM_COLORS = 1)
> crayon::num_ansi_colors()
[1] 1
> crayon::has_color()
[1] FALSE
Теперь, ключевым моментом здесь является то, что когда есть только один цвет, не создаются коды выхода цвета ANSI. Таким образом, в зависимости от того, поддерживает ли текущая среда R цвета или нет ( crayon::has_color()
), вы получите управляющие коды ANSI.
Поскольку вы, вероятно, хотите ограничить количество цветов только при sink()
редактировании, вы не хотите устанавливать постоянную настройку. Проще всего использовать withr для этого, например
library(tibble)
sink(file.path(tempdir(), "test.log"), append = FALSE)
withr::with_envvar(c(R_CLI_NUM_COLORS = 1), {
print(as_tibble(mtcars))
})
sink()
Это должно сделать это за вас.
Комментарии:
1. Для меня большая честь получить от тебя ответ, Хенрик. Спасибо за всю замечательную работу, которую вы проделали с R. В данном случае мне пришлось изменить ваш код, чтобы он работал в этой ситуации. Установка переменной среды не сработала для меня, но настройка параметров сработала. Возможно, это проблема Windows. Я сохраню ваш код и опубликую свои настройки ниже, на случай, если ваш ответ будет полезен кому-то еще.
2. Это работает для меня, но только если я окружу «as_tibble (mtcars)» «print ()», как вы написали. Но мне кажется