# flextable formatting

A flextable is made of parts, an header, a body and a footer. To specify which part formatting instructions should affect, use argument `part`. Possible values are:

- “header”: the header part of the table
- “footer”: the footer part of the table
- “body”: the body part of the table
- “all”: the body and the header parts of the table

## Shortcuts functions

There are simple functions to modify formatting properties of flextable objects: `bg`, `bold`, `border`, `color`, `padding`, `fontsize`, `italic`, `align`, …

They are illustrated in the examples below.

    myft <- flextable(head(iris))
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### bold

    myft <- flextable(head(iris))
    myft <- bold(myft, part = "header") # bold header
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### Font size

    myft <- fontsize(myft, part = "header", size = 12)
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### change font color

    myft <- color(myft, color = "#E4C994")
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### Italic

    myft <- italic(myft, i = ~ Sepal.Length > 5,
             j = ~ Sepal.Length + Sepal.Width, italic = TRUE)
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### change background color

    # light gray as background color for header
    myft <-  bg(myft, bg = "#E4C994", part = "header")
    # dark gray as background color for body
    myft <-  bg(myft, bg = "#333333", part = "body")
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### Text alignment

    myft <- align( myft, align = "center", part = "all" )
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### add padding

    myft <- padding( myft, padding = 3, part = "all" )
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### change font

    myft <- font(myft, j = "Species", fontname = "Times")
    myft <- fontsize(myft, j = "Species", size = 14)
    myft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

### Text rotation

Text rotation is possible in flextable objects by using function `rotate()`.

Argument `rotation` is mandatory and expects one of these values:

- “lrtb”, left to right top to bottom - the default value
- “tbrl”, top to bottom right to left
- “btlr”, bottom to top left to right

Argument `align` is used for cell content vertical alignment, it should be one of these values: “top”, “bottom” or “center”.

    ft <- flextable(head(iris))
    ft <- rotate(ft, rotation = "tbrl", align = "center", part = "header")
    ft <- align(ft, align = "right", part = "header")
    ft <- valign(ft, valign = "center", part = "header")
    ft <- align(ft, align = "center", part = "body")

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
4.7 | 3.2 | 1.3 | 0.2 | setosa
4.6 | 3.1 | 1.5 | 0.2 | setosa
5.0 | 3.6 | 1.4 | 0.2 | setosa
5.4 | 3.9 | 1.7 | 0.4 | setosa

## Borders

Borders properties can be defined with function `border()` but the function requires careful settings to avoid overlapping borders.

If no special formatting is needed, best is to use `border_outer()`, `border_inner_h()` and `border_inner_v()`.

    library(officer)
    big_border = fp_border(color="orange", width = 2)
    border_v = fp_border(color="gray")
    border_h = fp_border(color="gray")

    dat <- iris[c(1:2, 51:52, 101:102),]
    ft <- flextable(dat)
    ft <- border_remove(x = ft)
    ft <- border_outer(ft, part="all", border = big_border )
    ft <- border_inner_h(ft, part="all", border = border_h )
    ft <- border_inner_v(ft, part="all", border = border_v )
    ft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
7.0 | 3.2 | 4.7 | 1.4 | versicolor
6.4 | 3.2 | 4.5 | 1.5 | versicolor
6.3 | 3.3 | 6.0 | 2.5 | virginica
5.8 | 2.7 | 5.1 | 1.9 | virginica

When more control over borders formatting is necessary, the following functions can be used to add vertical or horizontal lines as borders:

- `hline()`: set bottom borders (inner horizontal)
- `vline()`: set right borders (inner vertical)
- `hline_top()`: set the top border (outer horizontal)
- `hline_bottom()`: set the bottom border (outer horizontal)
- `vline_left()`: set the left border (outer vertical)
- `vline_right()`: set the right border (outer vertical)

    dat <- iris[c(1:2, 51:52, 101:102),]
    ft <- flextable(dat)
    ft <- border_remove( ft )

    big_b <- fp_border(color="gray70", width = 3)
    std_b <- fp_border(color="orange", style = "dashed")

    ft <- vline( ft, border = std_b, part = "all" )
    ft <- vline_left( ft, border = big_b, part = "all" )
    ft <- vline_right( ft, border = big_b, part = "all" )
    ft <- hline( ft, border = std_b )
    ft <- hline_bottom( ft, border = big_b )
    ft <- hline_top( ft, border = big_b, part = "all" )
    ft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
7.0 | 3.2 | 4.7 | 1.4 | versicolor
6.4 | 3.2 | 4.5 | 1.5 | versicolor
6.3 | 3.3 | 6.0 | 2.5 | virginica
5.8 | 2.7 | 5.1 | 1.9 | virginica

## Conditional formatting

Conditional formatting can be made by using the selector arguments.

    dat <- iris[c(1:2, 51:52, 101:102),]
    ft <- flextable(dat)
    ft <- fontsize(ft, size = 14, part = "all")
    ft <- color(ft, i = ~ Sepal.Length < 5 & Petal.Length > 1.3,
            j = ~ Petal.Width + Species,
            color="red")
    ft <- italic(ft, i = ~ Sepal.Length > 5)
    ft <- bold(ft, i = 4, j = "Sepal.Length")
    ft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
7.0 | 3.2 | 4.7 | 1.4 | versicolor
6.4 | 3.2 | 4.5 | 1.5 | versicolor
6.3 | 3.3 | 6.0 | 2.5 | virginica
5.8 | 2.7 | 5.1 | 1.9 | virginica

`i` and `j` arguments can be also standard R vectors:

    row_id <- with(dat, Sepal.Length < 5 & Petal.Length > 1.3 )
    col_id <- c("Petal.Width", "Species")

    ft <- color(ft, i = row_id, j = col_id, color="red")

    ft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa
7.0 | 3.2 | 4.7 | 1.4 | versicolor
6.4 | 3.2 | 4.5 | 1.5 | versicolor
6.3 | 3.3 | 6.0 | 2.5 | virginica
5.8 | 2.7 | 5.1 | 1.9 | virginica

## Function style

The `style` function lets you style a selection of the flextable with several formatting properties.

> Its main advantage is to let specify a set of formatting properties for a selection.

Package officer needs to be loaded, it provides the following formatting properties:

- for text: `fp_text`
- for paragraphs: `fp_par`
- for cells: `fp_cell` and `fp_border`

    library(officer)
    def_cell <- fp_cell(border = fp_border(color="#00C9C9"))
    def_par <- fp_par(text.align = "center")
    def_text <- fp_text(color="#999999", italic = TRUE)
    def_text_header <- update(color="black", def_text, bold = TRUE)

    ft <- flextable(head(mtcars, n = 10 ))
    ft <- style( ft, pr_c = def_cell, pr_p = def_par, pr_t = def_text, part = "all")
    ft

mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb
21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4
21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4
22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1
21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1
18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2
18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1
14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4
24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2
22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2
19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4

    ft <- style( ft, pr_t = def_text_header, part = "header")
    ft

mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb
21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4
21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4
22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1
21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1
18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2
18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1
14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4
24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2
22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2
19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4