Search code examples
rformattingpowerpointflextablereporters

R - ReporteRs Package. Is it possible to apply conditional formatting to text?


I have following dataframe:

> View(AuthorsMM)

    Autor    #  Sentiment
1   Autor 1  33 J
2   Autor 2  33 J
3   Autor 3  22 K
4   Autor 4  18 L
5   Autor 5  16 L
6   Autor 6  15 K
7   Autor 7  15 L
8   Autor 8  15 K
9   Autor 9  15 K
10  Autor 10 14 K

I am using the package ReporteRs to send this data.frame as flextable to Powerpoint:

AuthorsMM_ft <- FlexTable( data = head(AuthorsMM,10), header.columns = TRUE )

I define the sentiment column with the followig text properties:

AuthorsMM_ft[, 3] = textProperties( color = 'white', font.weight = 'bold', font.family = 'Wingdings', font.size = 12 )

which makes Powerpoint display different emoticons (because of the Wingdings trueType) according to the content of the column.

However, I would like to aditionally apply different colors (green, yellow, red) to the text depending of the content. Therefore:

  • if (Sentiment == "J") then textProperties( color = 'green', font.weight = 'bold', font.family = 'Wingdings', font.size = 12 )

  • if (Sentiment == "K") then textProperties( color = 'yellow', font.weight = 'bold', font.family = 'Wingdings', font.size = 12 )

  • if (Sentiment == "L") then textProperties( color = 'red', font.weight = 'bold', font.family = 'Wingdings', font.size = 12 )

It's that possible using this package?


Solution

  • Yes, it is possible.

    This code shows how to do it:

    library(ReporteRs)
    
    # define the data frame - extracted with dput()
    AuthorsMM <- structure(list(Autor = c("Autor 1", "Autor 2", "Autor 3", "Autor 4", 
                                          "Autor 5", "Autor 6", "Autor 7", "Autor 8", "Autor 9", "Autor 10"
    ), `#` = c(33L, 33L, 22L, 18L, 16L, 15L, 15L, 15L, 15L, 14L), 
    Sentiment = c("J", "J", "K", "L", "L", "K", "L", "K", "K", 
                  "K")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                                 -10L), .Names = c("Autor", "#", "Sentiment"), spec = structure(list(
                                                                                   cols = structure(list(Autor = structure(list(), class = c("collector_character", 
                                                                                                                                             "collector")), `#` = structure(list(), class = c("collector_integer", 
                                                                                                                                                                                              "collector")), Sentiment = structure(list(), class = c("collector_character", 
                                                                                                                                                                                                                                                     "collector"))), .Names = c("Autor", "#", "Sentiment")), default = structure(list(), class = c("collector_guess", 
                                                                                                                                                                                                                                                                                                                                                   "collector"))), .Names = c("cols", "default"), class = "col_spec"))
    
    # conditional formatting:
    base_text_prop = textProperties(font.size = 12, 
                                color = "black",
                                font.weight = 'bold',
                                font.family = 'Wingdings')
    
    myCellProps = cellProperties(padding = 5)
    
    AuthorsMM_ft <- FlexTable(data = head(AuthorsMM,10), 
                          header.columns = TRUE,
                          body.text.props = base_text_prop)
    
    AuthorsMM_ft[AuthorsMM$Sentiment == 'J',3] = chprop(base_text_prop, color = 'green')
    AuthorsMM_ft[AuthorsMM$Sentiment == 'K',3] = chprop(base_text_prop, color = 'yellow')
    AuthorsMM_ft[AuthorsMM$Sentiment == 'L',3] = chprop(base_text_prop, color = 'red')
    AuthorsMM_ft
    

    enter image description here

    For some reason defining textProperties within FlexTable didn't work. When I used background.color it seemed to change the format.

    More examples of changing properties and conditional formatting in FlexTables.