Add a list of tables in an officer document. crosstables
will be added using body_add_crosstable()
and flextables
will be added using flextable::body_add_flextable()
. Plain dataframes will be converted to flextables.
Usage
body_add_table_list(
doc,
l,
fun_before = "title2",
fun_after = NULL,
fun = fun_before,
...
)
body_add_flextable_list(...)
body_add_crosstable_list(...)
Arguments
- doc
a
rdocx
object, created byofficer::read_docx()
- l
a named list of tables (of class
crosstable
,flextable
, ordata.frame
).- fun_before
a function to be used before each table
- fun_after
a function to be used after each table.
- fun
Deprecated
- ...
arguments passed on to
body_add_crosstable()
orflextable::body_add_flextable()
fun_before
and fun_after
These should be function of the form function(doc, .name)
where .name
is the name of the current table of the list.
You can also pass "title2"
to add the name as a title of level 2 between each table (works for levels 3 and 4 as well), "newline"
to simply add a new line, or even NULL
to not separate them (beware that the tables might merge then).
fun_before
is designed to add a title while fun_after
is designed to add a table legend (cf. examples).
Examples
library(officer)
ctl = list(iris2=crosstable(iris2, 1),
"Just a flextable"=flextable::flextable(mtcars2[1:5,1:5]),
"Just a dataframe"=iris2[1:5,1:5])
fun1 = function(doc, .name){
doc %>%
body_add_title(" This is table '{.name}' as a flex/crosstable", level=2) %>%
body_add_normal("Here is the table:")
}
fun2 = function(doc, .name){
doc %>% body_add_table_legend("{.name}", bookmark=.name)
}
read_docx() %>%
body_add_title("Separated by subtitle", 1) %>%
body_add_table_list(ctl, fun_before="title2") %>%
body_add_break() %>%
body_add_title("Separated using a custom function", 1) %>%
body_add_normal("You can therefore use bookmarks, for instance here are
tables \\@ref(iris2), \\@ref(just_a_flextable)
and \\@ref(just_a_dataframe).") %>%
body_add_table_list(ctl, fun_before=fun1, fun_after=fun2, body_fontsize=8) %>%
write_and_open()