---
title: "Table Export"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Table Export}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
message = FALSE,
warning = FALSE,
eval = FALSE
)
old_opts <- options(width = 180)
```
Publication requires tables in specific formats: PDF for static outputs, Word documents for collaborative drafting, LaTeX for manuscript preparation, HTML for web supplements, PowerPoint for presentations, and RTF for broad compatability. The `summata` package provides export functions for each format, with consistent parameters across formats and format-specific options where needed.
| Function | Format | Dependencies |
|:---------|:-------|:-------------|
| `data.table::fwrite()` | CSV / TSV | `data.table` |
| `table2pdf()` | PDF | `xtable`, LaTeX distribution |
| `table2docx()` | Microsoft Word (.docx) | `flextable`, `officer` |
| `table2html()` | HTML | `xtable` |
| `table2pptx()` | PowerPoint (.pptx) | `flextable`, `officer` |
| `table2tex()` | LaTeX source (.tex) | `xtable` |
| `table2rtf()` | Rich Text Format (.rtf) | `flextable` |
| `autotable()` | Auto-detect from extension | Varies |
For delimited text formats (CSV, TSV), tables can be written directly with `data.table::fwrite()` since all `summata` output tables are `data.table` objects. For formatted document output, these functions follow a standard syntax when called:
``` r
result <- autotable(data, "output.pdf", ...)
```
where `data` is the dataset, and `"output.pdf"` is the name of the destination file. This vignette demonstrates the various capabilities of these functions using the included sample dataset.
---
# Preliminaries
The examples in this vignette create sample tables using `summata` functions:
```{r setup, eval = TRUE}
library(summata)
data(clintrial)
data(clintrial_labels)
# Create sample tables for export
table1 <- desctable(
data = clintrial,
by = "treatment",
variables = c("age", "sex", "bmi", "smoking", "stage", "ecog"),
labels = clintrial_labels
)
table2 <- fullfit(
data = clintrial,
outcome = "surgery",
predictors = c("age", "sex", "stage", "treatment", "ecog"),
model_type = "glm",
labels = clintrial_labels
)
table3 <- fullfit(
data = clintrial,
outcome = "Surv(os_months, os_status)",
predictors = c("age", "sex", "stage", "treatment", "ecog"),
model_type = "coxph",
labels = clintrial_labels
)
table4 <- compfit(
data = clintrial,
outcome = "surgery",
model_list = list(
"Demographics" = c("age", "sex"),
"Clinical" = c("age", "sex", "stage", "ecog"),
"Full" = c("age", "sex", "stage", "ecog", "treatment")
),
model_type = "glm"
)
```
---
# CSV / TSV Export
All `summata` output tables are `data.table` objects, so they can be written to delimited text files directly with `data.table::fwrite()`. This is the simplest export path and requires no additional dependencies beyond `data.table`, which `summata` already imports.
## **Example 1:** CSV Export
```{r}
data.table::fwrite(table1, file.path(tempdir(), "Table1.csv"))
```
## **Example 2:** TSV Export
Specify a tab delimiter for TSV output:
```{r}
data.table::fwrite(table1, file.path(tempdir(), "Table1.tsv"), sep = "\t")
```
## **Example 3:** Semicolon-Delimited (European Locale)
Use a semicolon delimiter for compatibility with locales where the comma is the decimal separator:
```{r}
data.table::fwrite(table1, file.path(tempdir(), "Table1.csv"), sep = ";")
```
CSV and TSV files are useful for archiving raw table output, importing into spreadsheet software, or downstream processing in other statistical environments. For formatted, publication-ready output, use the export functions described in the sections that follow.
---
# PDF Export
The `table2pdf()` function creates PDF documents using LaTeX typesetting via the `xtable` package. A LaTeX distribution (TinyTeX, TeX Live, MiKTeX, or MacTeX) is required.
## **Example 4:** Basic Export
The simplest usage requires only a table and filename:
```{r}
table2pdf(
table = table1,
file = file.path(tempdir(), "Table1.pdf")
)
```
## **Example 5:** With Caption
Add a caption using the `caption` parameter:
```{r}
table2pdf(
table = table1,
file = file.path(tempdir(), "Table1.pdf"),
caption = "Table 1. Baseline Characteristics by Group"
)
```
## **Example 6:** With Formatting Options
Multiple formatting options can be combined:
```{r}
table2pdf(
table = table2,
file = file.path(tempdir(), "Table2.pdf"),
caption = "Table 2. Regression Analysis",
font_size = 8,
bold_significant = TRUE,
p_threshold = 0.05,
indent_groups = TRUE,
variable_padding = TRUE,
zebra_stripes = TRUE
)
```
## **Example 7:** Page Layout
Control page size and orientation:
```{r}
table2pdf(
table = table2,
file = file.path(tempdir(), "Table2_Landscape.pdf"),
caption = "Table 2. Regression Results",
paper = "letter",
orientation = "landscape"
)
```
## **Example 8:** Custom Margins
Adjust page margins (in inches):
```{r}
table2pdf(
table = table2,
file = file.path(tempdir(), "Table2_Margins.pdf"),
margins = c(0.5, 0.5, 0.5, 0.5) # top, right, bottom, left
)
```
## **Example 9:** Fit to Page Width
Scale tables to fit the page width:
```{r}
table2pdf(
table = table2,
file = file.path(tempdir(), "Table2_Fitted.pdf"),
fit_to_page = TRUE
)
```
## **Example 10:** Standalone Table
Standalone settings are useful for embedding tables in larger documents:
```{r}
table2pdf(
table = table2,
file = file.path(tempdir(), "Table2_Auto.pdf"),
paper = "auto"
)
```
---
# Microsoft Word Export
The `table2docx()` function creates editable Word documents using the `flextable` and `officer` packages.
## **Example 11:** Basic Export
The simplest usage requires only a table and filename:
```{r}
table2docx(
table = table1,
file = file.path(tempdir(), "Table1.docx")
)
```
## **Example 12:** With Caption
Add a caption using the `caption` parameter:
```{r}
table2docx(
table = table1,
file = file.path(tempdir(), "Table1.docx"),
caption = "Table 1. Baseline Characteristics by Group"
)
```
## **Example 13:** With Formatting Options
Multiple formatting options can be combined:
```{r}
table2docx(
table = table2,
file = file.path(tempdir(), "Table2.docx"),
caption = "Table 2. Regression Analysis",
font_size = 9,
font_family = "Times New Roman",
bold_significant = TRUE,
p_threshold = 0.05,
indent_groups = TRUE,
zebra_stripes = TRUE
)
```
## **Example 14:** Page Layout
Control page size and orientation for wide tables:
```{r}
table2docx(
table = table2,
file = file.path(tempdir(), "Table2_Landscape.docx"),
caption = "Table 2. Regression Results",
paper = "letter",
orientation = "landscape"
)
```
## **Example 15:** Dark Header Style
Use a dark header background for visual emphasis:
```{r}
table2docx(
table = table1,
file = file.path(tempdir(), "Table1_DarkHeader.docx"),
caption = "Table 1. Baseline Characteristics",
dark_header = TRUE,
zebra_stripes = TRUE
)
```
---
# HTML Export
The `table2html()` function exports tables to HTML file output for web use via the `xtable` package.
## **Example 16:** Basic Export
The simplest usage requires only a table and filename:
```{r}
table2html(
table = table1,
file = file.path(tempdir(), "Table1.html")
)
```
## **Example 17:** With Caption
Add a caption using the `caption` parameter:
```{r}
table2html(
table = table1,
file = file.path(tempdir(), "Table1.html"),
caption = "Table 1. Baseline Characteristics"
)
```
## **Example 18:** With Formatting Options
Multiple formatting options can be combined:
```{r}
table2html(
table = table2,
file = file.path(tempdir(), "Table2.html"),
caption = "Table 2. Regression Analysis",
bold_significant = TRUE,
indent_groups = TRUE,
zebra_stripes = TRUE,
stripe_color = "#f5f5f5"
)
```
---
# PowerPoint Export
The `table2pptx()` function creates PowerPoint presentations with tables using the `flextable` and `officer` packages.
## **Example 19:** Basic Export
The simplest usage creates a single-slide presentation:
```{r}
table2pptx(
table = table1,
file = file.path(tempdir(), "Table1.pptx")
)
```
## **Example 20:** With Slide Title
Add a slide title using the `slide_title` parameter:
```{r}
table2pptx(
table = table1,
file = file.path(tempdir(), "Table1.pptx"),
slide_title = "Baseline Characteristics"
)
```
## **Example 21:** With Formatting Options
Multiple formatting options can be combined:
```{r}
table2pptx(
table = table2,
file = file.path(tempdir(), "Table2.pptx"),
slide_title = "Regression Analysis",
font_size = 10,
font_family = "Arial",
bold_significant = TRUE,
indent_groups = TRUE,
zebra_stripes = TRUE
)
```
## **Example 22:** Custom Template
Use an existing PowerPoint template:
```{r}
table2pptx(
table = table1,
file = file.path(tempdir(), "Table1_Custom.pptx"),
template = "my_template.pptx",
layout = "Title and Content",
master = "Office Theme"
)
```
---
# LaTeX Export
The `table2tex()` function creates LaTeX source files for inclusion in manuscripts via the `xtable` package.
## **Example 23:** Basic Export
The simplest usage requires only a table and filename:
```{r}
table2tex(
table = table1,
file = file.path(tempdir(), "Table1.tex")
)
```
## **Example 24:** With Caption and Label
Add caption and cross-reference label:
```{r}
table2tex(
table = table1,
file = file.path(tempdir(), "Table1.tex"),
caption = "Baseline Characteristics by Group",
label = "tab:demographics"
)
```
## **Example 25:** With Booktabs Styling
Use the booktabs package for professional formatting:
```{r}
table2tex(
table = table2,
file = file.path(tempdir(), "Table2.tex"),
caption = "Regression Analysis",
label = "tab:regression",
booktabs = TRUE,
bold_significant = TRUE,
indent_groups = TRUE
)
```
---
# RTF Export
The `table2rtf()` function creates Rich Text Format files using the `flextable` and `officer` packages.
## **Example 26:** Basic Export
The simplest usage requires only a table and filename:
```{r}
table2rtf(
table = table1,
file = file.path(tempdir(), "Table1.rtf")
)
```
## **Example 27:** With Formatting Options
Multiple formatting options can be combined:
```{r}
table2rtf(
table = table2,
file = file.path(tempdir(), "Table2.rtf"),
caption = "Table 2. Regression Analysis",
font_size = 9,
font_family = "Times New Roman",
bold_significant = TRUE,
indent_groups = TRUE,
zebra_stripes = TRUE
)
```
## **Example 28:** Page Layout
Control page size and orientation:
```{r}
table2rtf(
table = table2,
file = file.path(tempdir(), "Table2_Landscape.rtf"),
paper = "letter",
orientation = "landscape"
)
```
---
# Automatic Format Detection
The `autotable()` function detects the output format from the file extension, simplifying the export workflow:
```{r}
autotable(table1, file.path(tempdir(), "Table1.csv")) # CSV output
autotable(table1, file.path(tempdir(), "Table1.tsv")) # TSV output
autotable(table1, file.path(tempdir(), "Table1.pdf")) # PDF output
autotable(table1, file.path(tempdir(), "Table1.docx")) # DOCX output
autotable(table1, file.path(tempdir(), "Table1.html")) # HTML output
autotable(table1, file.path(tempdir(), "Table1.pptx")) # PPTX output
autotable(table1, file.path(tempdir(), "Table1.tex")) # TeX output
autotable(table1, file.path(tempdir(), "Table1.rtf")) # RTF output
```
Format-specific parameters pass through to the underlying function:
```{r}
autotable(
table = table2,
file = file.path(tempdir(), "Table2.pdf"),
caption = "Table 2. Regression Analysis",
orientation = "landscape",
font_size = 8,
bold_significant = TRUE,
indent_groups = TRUE,
zebra_stripes = TRUE
)
```
---
# Common Formatting Parameters
All export functions share common parameters for consistent results:
| Parameter | Description | Default |
|:----------|:------------|:--------|
| `caption` | Table caption/title | `NULL` |
| `font_size` | Base font size (points) | 8–10 |
| `format_headers` | Auto-format column headers | `TRUE` |
| `bold_significant` | Bold significant *p*-values | `TRUE` |
| `p_threshold` | Significance threshold | 0.05 |
| `indent_groups` | Indent factor levels | `FALSE` |
| `condense_table` | Show essential rows only | `FALSE` |
| `condense_quantitative` | Condense continuous/survival only (`desctable()` only) | `FALSE` |
| `zebra_stripes` | Alternating row shading | `FALSE` |
| `dark_header` | Dark header background | `FALSE` |
## Condensing Options
The `condense_table` and `condense_quantitative` parameters reduce table height:
- `condense_table = TRUE`: Condenses continuous, survival, and binary categorical variables
- `condense_quantitative = TRUE`: Condenses only continuous and survival variables (`desctable()` outputs only)
```{r}
# Full display
table2docx(table1, file.path(tempdir(), "Table1_Full.docx"))
# Condense all variable types
table2docx(
table = table1,
file = file.path(tempdir(), "Table1_Condensed.docx"),
condense_table = TRUE,
zebra_stripes = TRUE
)
# Condense only continuous/survival (descriptive tables only)
table2docx(
table = table1,
file = file.path(tempdir(), "Table1_CondenseQuant.docx"),
condense_quantitative = TRUE,
zebra_stripes = TRUE
)
```
---
# Format-Specific Parameters
## PDF
| Parameter | Description | Default |
|:----------|:------------|:--------|
| `margins` | Page margins `c(top, right, bottom, left)` | `c(1, 1, 1, 1)` |
| `fit_to_page` | Scale table to fit page width | `TRUE` |
| `cell_padding` | Vertical padding ("none", "normal", "relaxed", "loose") | `"normal"` |
| `variable_padding` | Add spacing between variables | `FALSE` |
| `show_logs` | Keep LaTeX log files | `FALSE` |
## Word/RTF/PowerPoint
| Parameter | Description | Default |
|:----------|:------------|:--------|
| `font_family` | Font name | `Arial` |
| `width` | Table width (inches) | `NULL` |
| `align` | Column alignment vector | `NULL` |
| `return_ft` | Return flextable object | `FALSE` |
## HTML
| Parameter | Description | Default |
|:----------|:------------|:--------|
| `include_css` | Include embedded CSS styling | `FALSE` |
| `stripe_color` | Zebra stripe color (hex or name) | `"#EEEEEE"` |
## LaTeX
| Parameter | Description | Default |
|:----------|:------------|:--------|
| `booktabs` | Use booktabs package styling | `FALSE` |
| `label` | LaTeX cross-reference label | `NULL` |
| `cell_padding` | Arraystretch value | `"normal"` |
## PowerPoint (additional)
| Parameter | Description | Default |
|:----------|:------------|:--------|
| `template` | Custom PPTX template file | `NULL` |
| `layout` | Slide layout name | `"Title and Content"` |
| `master` | Slide master name | `"Office Theme"` |
| `left`, `top` | Table position (inches) | `0.5`, `1.5` |
---
# Best Practices
## Format Selection
| Use-Case | Recommended Format |
|:---------|:-------------------|
| Data archival, further processing | CSV (.csv) or TSV (.tsv) |
| Journal submission | PDF (.pdf) or LaTeX (.tex) |
| Manuscript drafts, collaboration | Word (.docx) |
| Web/R Markdown | HTML (.html) |
| Presentations | PowerPoint (.pptx) |
| Maximum compatibility | RTF (.rtf) |
## Page Layout Guidelines
1. **Portrait**: Tables with ≤ 6 columns
2. **Landscape**: Tables with > 6 columns
3. **Auto-sizing**: Use `paper = "auto"` for embedding
## Consistent Multi-Format Export
Export to multiple formats with consistent formatting:
```{r}
common_opts <- list(
caption = "Table 2. Regression Analysis",
bold_significant = TRUE,
indent_groups = TRUE,
zebra_stripes = TRUE
)
formats <- c("csv", "pdf", "docx", "html", "pptx", "rtf", "tex")
for (fmt in formats) {
autotable(
table = table2,
file = file.path(tempdir(), paste0("Table2.", fmt)),
caption = common_opts$caption,
bold_significant = common_opts$bold_significant,
indent_groups = common_opts$indent_groups,
zebra_stripes = common_opts$zebra_stripes
)
}
```
---
# Troubleshooting
## PDF Compilation Fails
Verify LaTeX installation and consider keeping log files for debugging:
```{r}
# Check LaTeX installation
Sys.which("pdflatex")
# Install TinyTeX if needed
# tinytex::install_tinytex()
# Keep log files for debugging
table2pdf(table, file.path(tempdir(), "debug.pdf"), show_logs = TRUE)
```
See [Installation and Setup](installation_setup.html) for LaTeX configuration details.
## Table Too Wide
Several options address wide tables:
```{r}
# Use landscape orientation
table2pdf(table, file.path(tempdir(), "wide.pdf"), orientation = "landscape")
# Enable fit-to-page scaling
table2pdf(table, file.path(tempdir(), "wide.pdf"), fit_to_page = TRUE)
# Reduce font size
table2pdf(table, file.path(tempdir(), "wide.pdf"), font_size = 7)
```
## Customizing flextable Output
Get the flextable object for further customization:
```{r}
ft <- table2docx(table1, file.path(tempdir(), "Table1.docx"), return_ft = TRUE)
library(flextable)
ft <- ft %>%
bold(i = 1, part = "header") %>%
color(i = 1, color = "navy", part = "header")
save_as_docx(ft, path = file.path(tempdir(), "Table1_Custom.docx"))
```
```{r, include = FALSE}
options(old_opts)
```
---
# Further Reading
- [Descriptive Tables](descriptive_tables.html): `desctable()` for baseline characteristics
- [Regression Modeling](regression_modeling.html): `fit()`, `uniscreen()`, and `fullfit()`
- [Model Comparison](model_comparison.html): `compfit()` for comparing models
- [Forest Plots](forest_plots.html): Visualization of regression results
- [Multivariate Regression](multivariate_regression.html): `multifit()` for multi-outcome analysis
- [Advanced Workflows](advanced_workflows.html): Interactions and mixed-effects models