Reputation: 1161
I am writing a script and I want to output text messages to the console with different colors depending on conditions. For example: RED for errors and BLUE for warnings, etc.
I am using RStudio.
Upvotes: 73
Views: 35314
Reputation: 528
Late to the game but building on @Pedro_S's answer here's an example of how could write functions to use ANSI colours to print coloured text based on plain text input of colours ("red"
, "green"
, etc.):
#' Convert plain text colour to ANSI code
#'
#' @param colour colour in plain text ("red", "green", etc.) to convert to ANSI
#'
#' @return string representing provided colour as ANSI encoding
#'
#' @examples
#' colour_to_ansi("red") # gives: "\033[31m"
colour_to_ansi <- function(colour) {
# Note ANSI colour codes
colour_codes <- list(
"black" = 30,
"red" = 31,
"green" = 32,
"yellow" = 33,
"blue" = 34,
"magenta" = 35,
"cyan" = 36,
"white" = 37
)
# Check colour provided in codes above
if (colour %in% names(colour_codes) == FALSE) {
stop(
paste0(
"Colour provided (", colour, ") can't be converted to ANSI. ",
"Must be one of: \n", paste(names(colour_codes), collapse = ",")
)
)
}
# Create ANSI version of colour
ansi_colour <- paste0("\033[", colour_codes[[colour]], "m")
return(ansi_colour)
}
#' Print (cat) progress text as coloured text
#'
#' @param text string to print using cat()
#' @param colour plain text colour ("red", "green", etc.). Defaults to "green"
#'
#' @examples
#' coloured_print("This is a test", colour = "blue")
coloured_print <- function(text, colour = "green") {
cat(colour_to_ansi(colour), text, "\033[0m\n")
}
Upvotes: 3
Reputation: 81
Actually, there IS a way without using R packages (Crayon and cli):
Use cat, paste0 and some ANSI hell to do it:
txt<-"rainbow"
for(col in 29:47){ cat(paste0("\033[0;", col, "m",txt,"\033[0m","\n"))}
You will need to do a bigger function, since cat is not very flexible, but this works well.
Obs: This solution was observed by a colleague, which is a perl stan.
Upvotes: 8
Reputation: 41285
Another option could be using the insight
package with the print_color
function. You could also make the text bold or italic. Here is some reproducible code:
library(insight)
print_color("ERROR", "red")
print_color("WARNINGS", "blue")
Output RStudio:
Upvotes: 5
Reputation: 136
On either Linux or Mac, you could try https://github.com/jalvesaq/colorout It doesn't work on Windows.
Upvotes: 1
Reputation: 25454
Check out the new crayon
package:
library(crayon)
cat(blue("Hello", "world!\n"))
More info on the GitHub page.
Works in RStudio 1.2.360+
Upvotes: 65
Reputation: 174813
The xterm256 package by Romain Francoise allows this sort of thing in general on any console that understands xterm256 interrupts.
Upvotes: 3