R печать непечатаемых цветовых кодов карандашей при печати на токе ()

#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 ()», как вы написали. Но мне кажется print , что в прошлом это не требовалось для вывода tibble в файл с использованием sink. Может быть, мне просто повезло, и я полагался на неподдерживаемое поведение?

Ответ №2:

Основываясь на замечательном предложении от @HenrikB, это код, который, наконец, сработал для меня:

   library(tibble)
  
  sink(file.path(tempdir(), "test.log"), append = FALSE)
  
  withr::with_options(c("crayon.colors" = 1), { 
    print(as_tibble(mtcars))
  })
  
  sink()

 

введите описание изображения здесь