【问题标题】:R printing non-printable crayon color codes when printing to sink()R在打印到sink()时打印不可打印的蜡笔颜色代码
【发布时间】:2021-06-30 19:11:32
【问题描述】:

我有两台 Windows 机器。两个 Windows 10。当我在每个上运行以下代码时,我得到两个非常不同的输出:

library(tibble)

sink(file.path(tempdir(), "test.log"), append = FALSE)
     
print(as_tibble(mtcars))

sink()

一台机器给了我预期的输出:

另一台机器给了我相同的 tibble 数据,但似乎正在打印所有蜡笔颜色代码:

起初我认为它必须是 R 版本或蜡笔版本的差异。但是我现在已经在 R 4.0.3 和 crayon 1.3.4 上同步了。两者的 Tibble 版本都是 3.0.4。不知道接下来要检查什么。第二台机器最初拥有所有东西的更新版本。但我尽可能地恢复了,我仍然得到颜色代码。

有人对如何诊断有任何建议吗?

【问题讨论】:

标签: r printing tibble sink crayon


【解决方案1】:

颜色由 crayon 包控制。您可以查询该包以了解支持多少种颜色,例如

> 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():ing 时限制颜色数量,因此您不想永久设置。最简单的是为此使用 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()

这应该为你做。

【讨论】:

  • 很荣幸收到您的答复,Henrik。感谢您为 R 所做的所有出色工作。在手头的案例中,我不得不修改您的代码以使其在这种情况下工作。设置环境变量对我不起作用,但设置选项可以。也许这是Windows的事情。我会保留你的代码并在下面发布我的调整,以防你的答案对其他人有用。
  • 这对我有用,但前提是我将“as_tibble(mtcars)”与“print()”括起来,就像你写的那样。但在我看来,过去不需要print 来使用接收器将 tibble 输出到文件。也许我只是走运并依赖不受支持的行为?
【解决方案2】:

根据@HenrikB 的建议,这是最终对我有用的代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多