By default, the displayed content of each cell will be the result of a simple formatting. The content can also be comoosed as the result of a concatenation of several chunks.
There are formatter
functions to define how columns content will be display (e.g. to define the number of decimal). This is a column-wise operation.
User can also have more control over displayed content by using function compose
. The function enable to define the elements composing the paragraph and their respective formats. It can also be used to mix text chunks and images.
Theses are high level functions that should satisfy most of the usual needs. They can be used to define the formatting of one or more columns.
Each accept a prefix
and suffix
argument that can be used to add a currency symbol for example. Also they all have na_str
argument (defaut to ""), the string to use when data are not available.
colformat_num()
with arguments digits
and big.mark
colformat_int()
with arguments big.mark
colformat_char()
dat <- head(mtcars, n = 10)
dat[3:7, 1] <- NA
dat[, 2] <- dat[, 6] * 1000000
ft <- flextable(dat)
num_keys <- c("mpg", "disp", "drat", "wt", "qsec")
int_keys <- c("cyl", "hp", "vs", "am", "gear", "carb")
ft <- colformat_num(x = ft, col_keys = num_keys, big.mark = ",", digits = 2, na_str = "missing")
ft <- colformat_int(x = ft, col_keys = int_keys, big.mark = ",")
autofit(ft)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb |
21.00 | 2,620,000 | 160.00 | 110 | 3.90 | 2.62 | 16.46 | 0 | 1 | 4 | 4 |
21.00 | 2,875,000 | 160.00 | 110 | 3.90 | 2.88 | 17.02 | 0 | 1 | 4 | 4 |
missing | 2,320,000 | 108.00 | 93 | 3.85 | 2.32 | 18.61 | 1 | 1 | 4 | 1 |
missing | 3,215,000 | 258.00 | 110 | 3.08 | 3.21 | 19.44 | 1 | 0 | 3 | 1 |
missing | 3,440,000 | 360.00 | 175 | 3.15 | 3.44 | 17.02 | 0 | 0 | 3 | 2 |
missing | 3,460,000 | 225.00 | 105 | 2.76 | 3.46 | 20.22 | 1 | 0 | 3 | 1 |
missing | 3,570,000 | 360.00 | 245 | 3.21 | 3.57 | 15.84 | 0 | 0 | 3 | 4 |
24.40 | 3,190,000 | 146.70 | 62 | 3.69 | 3.19 | 20.00 | 1 | 0 | 4 | 2 |
22.80 | 3,150,000 | 140.80 | 95 | 3.92 | 3.15 | 22.90 | 1 | 0 | 4 | 2 |
19.20 | 3,440,000 | 167.60 | 123 | 3.92 | 3.44 | 18.30 | 1 | 0 | 4 | 4 |
It is possible to define the functions that will be used to format the data.frame values into strings. set_formatter
set column formatter functions.
ft <- flextable(head(mtcars, n = 10 ),
col_keys = c("gear", "mpg", "qsec"))
ft <- set_formatter(ft,
mpg = function(x) sprintf("%.04f", x),
gear = function(x) sprintf("%.0f gears", x)
)
ft <- theme_booktabs(ft)
ft <- autofit(ft)
ft
gear | mpg | qsec |
4 gears | 21.0000 | 16.460 |
4 gears | 21.0000 | 17.020 |
4 gears | 22.8000 | 18.610 |
3 gears | 21.4000 | 19.440 |
3 gears | 18.7000 | 17.020 |
3 gears | 18.1000 | 20.220 |
3 gears | 14.3000 | 15.840 |
4 gears | 24.4000 | 20.000 |
4 gears | 22.8000 | 22.900 |
4 gears | 19.2000 | 18.300 |
flextable
content can be defined with function compose
.
It lets user control the formated content at the cell level of the table. It is possible to define a content for a row subset and a column as well as on the whole column. One can mix images and text (but not with PowerPoint because PowerPoint can not do it).
Below the starting point of next illustrations:
myft <- flextable( head(mtcars),
col_keys = c("am", "separator", "gear", "mpg", "drat", "qsec" ))
myft <- bold(myft, part = "header")
myft <- border(myft, border = fp_border( width = 0),
border.top = fp_border(), border.bottom = fp_border(),
part = "all")
myft <- align(myft, align = "right", part = "all" )
myft <- border(myft, j = ~ separator, border = fp_border(width=0), part = "all")
myft <- width(myft, j = ~ separator, width = .1)
myft
am | gear | mpg | drat | qsec | |
1.000 | 4.000 | 21.000 | 3.900 | 16.460 | |
1.000 | 4.000 | 21.000 | 3.900 | 17.020 | |
1.000 | 4.000 | 22.800 | 3.850 | 18.610 | |
0.000 | 3.000 | 21.400 | 3.080 | 19.440 | |
0.000 | 3.000 | 18.700 | 3.150 | 17.020 | |
0.000 | 3.000 | 18.100 | 2.760 | 20.220 |
The function requires a call to as_paragraph
which will concatenate text or images chunks as a paragraph.
The following example shows how to control the format of displayed values and how to associate them with specific text formatting properties (bold red text):
myft <- compose(
myft, j = "mpg",
value = as_paragraph(
"mpg value is ",
as_chunk(sprintf("%.01f", mpg), props = fp_text(color = "red", bold = TRUE) ) )
)
myft <- autofit(myft)
myft
am | gear | mpg | drat | qsec | |
1.000 | 4.000 | mpg value is 21.0 | 3.900 | 16.460 | |
1.000 | 4.000 | mpg value is 21.0 | 3.900 | 17.020 | |
1.000 | 4.000 | mpg value is 22.8 | 3.850 | 18.610 | |
0.000 | 3.000 | mpg value is 21.4 | 3.080 | 19.440 | |
0.000 | 3.000 | mpg value is 18.7 | 3.150 | 17.020 | |
0.000 | 3.000 | mpg value is 18.1 | 2.760 | 20.220 |
With that system, it’s easy to concatenate multiple values:
myft <- compose(
myft, j = "mpg",
value = as_paragraph(
"mpg value is ",
as_chunk(sprintf("%.01f", mpg), props = fp_text(color = "red", bold = TRUE) ),
" with ",
as_chunk(sprintf("# %.0f", carb), props = fp_text(color = "gray", italic = TRUE) )
)
)
myft <- autofit(myft)
myft
am | gear | mpg | drat | qsec | |
1.000 | 4.000 | mpg value is 21.0 with # 4 | 3.900 | 16.460 | |
1.000 | 4.000 | mpg value is 21.0 with # 4 | 3.900 | 17.020 | |
1.000 | 4.000 | mpg value is 22.8 with # 1 | 3.850 | 18.610 | |
0.000 | 3.000 | mpg value is 21.4 with # 1 | 3.080 | 19.440 | |
0.000 | 3.000 | mpg value is 18.7 with # 2 | 3.150 | 17.020 | |
0.000 | 3.000 | mpg value is 18.1 with # 1 | 2.760 | 20.220 |
Or to define specific title headers:
myft <- compose(
myft, j = "mpg", part = "header",
value = as_paragraph(
"Miles/(US) gallon ",
as_chunk("* with num of carb.", props = fp_text(color = "gray", vertical.align = "superscript") )
)
)
myft <- autofit(myft)
myft
am | gear | Miles/(US) gallon * with num of carb. | drat | qsec | |
1.000 | 4.000 | mpg value is 21.0 with # 4 | 3.900 | 16.460 | |
1.000 | 4.000 | mpg value is 21.0 with # 4 | 3.900 | 17.020 | |
1.000 | 4.000 | mpg value is 22.8 with # 1 | 3.850 | 18.610 | |
0.000 | 3.000 | mpg value is 21.4 with # 1 | 3.080 | 19.440 | |
0.000 | 3.000 | mpg value is 18.7 with # 2 | 3.150 | 17.020 | |
0.000 | 3.000 | mpg value is 18.1 with # 1 | 2.760 | 20.220 |
Function compose
supports images insertion. Use function as_image
in as_paragraph
call:
img.file <- file.path( R.home("doc"), "html", "logo.jpg" )
myft <- compose( myft, i = ~ qsec > 18, j = "qsec",
value = as_paragraph(as_image( src = img.file, width = .20, height = .15))
)
myft <- autofit(myft)
myft
am | gear | Miles/(US) gallon * with num of carb. | drat | qsec | |
1.000 | 4.000 | mpg value is 21.0 with # 4 | 3.900 | 16.460 | |
1.000 | 4.000 | mpg value is 21.0 with # 4 | 3.900 | 17.020 | |
1.000 | 4.000 | mpg value is 22.8 with # 1 | 3.850 | ||
0.000 | 3.000 | mpg value is 21.4 with # 1 | 3.080 | ||
0.000 | 3.000 | mpg value is 18.7 with # 2 | 3.150 | 17.020 | |
0.000 | 3.000 | mpg value is 18.1 with # 1 | 2.760 |
Function compose
supports mini barplots insertion. Use function minibar
in as_paragraph
call:
myft <- flextable( head(iris, n = 10 ))
myft <- compose( myft, j = 1,
value = as_paragraph(
minibar(value = Sepal.Length, max = max(Sepal.Length))
),
part = "body")
autofit(myft)
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
3.500 | 1.400 | 0.200 | setosa | |
3.000 | 1.400 | 0.200 | setosa | |
3.200 | 1.300 | 0.200 | setosa | |
3.100 | 1.500 | 0.200 | setosa | |
3.600 | 1.400 | 0.200 | setosa | |
3.900 | 1.700 | 0.400 | setosa | |
3.400 | 1.400 | 0.300 | setosa | |
3.400 | 1.500 | 0.200 | setosa | |
2.900 | 1.400 | 0.200 | setosa | |
3.100 | 1.500 | 0.100 | setosa |
Function compose
supports mini linerange insertion. Use function linerange
in as_paragraph
call:
myft <- flextable( head(iris, n = 10 ))
myft <- compose( myft, j = 1,
value = as_paragraph(
linerange(value = Sepal.Length, max = max(Sepal.Length))
),
part = "body")
autofit(myft)
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
3.500 | 1.400 | 0.200 | setosa | |
3.000 | 1.400 | 0.200 | setosa | |
3.200 | 1.300 | 0.200 | setosa | |
3.100 | 1.500 | 0.200 | setosa | |
3.600 | 1.400 | 0.200 | setosa | |
3.900 | 1.700 | 0.400 | setosa | |
3.400 | 1.400 | 0.300 | setosa | |
3.400 | 1.500 | 0.200 | setosa | |
2.900 | 1.400 | 0.200 | setosa | |
3.100 | 1.500 | 0.100 | setosa |