---
title: "Reports"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Reports}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = FALSE)
library(ksCompare)
```
A `ks_comparison` can be exported to two report formats. Both are
opt-in via `Suggests` packages so the core install stays small, and
neither requires Quarto, Pandoc, or any internet access.
## HTML
```{r}
iris2 <- transform(iris, row_id = seq_len(nrow(iris)))
cmp <- ks_compare(iris2, iris2, by = "row_id")
ks_report_html(
cmp,
"report.html",
title = "ADSL QC",
subtitle = "Study A1234"
)
```
The HTML report uses `htmltools` for layout and `reactable` for
filterable, searchable tables. Layout includes:
- an executive verdict bar and recommendations card,
- a sticky left-hand table of contents with section badges,
- KPI cards summarising matched / unmatched rows and columns,
- Schema, Row matching, Unmatched rows, Columns with differences,
Diff causes, Most-affected rows, Value differences, Patterns, and
Manifest sections,
- a print-friendly stylesheet.
Pass `path = NA` to get the assembled `htmltools::tagList()` for
embedding in another document. Pass `theme = "slate"` for a neutral
dark-header theme. If the comparison was not run with
`find_patterns = TRUE`, the Patterns section is still present but will
be empty.
### Smart sampling
Every report table respects `max_rows` (default `100`). For large
value-diff tables, rows above the cap are replaced by a *stratified
sample* covering
each affected column and each distinct diff cause (`note`),
prioritising the largest numeric magnitudes. A notice indicates the
sample size and recommends `as_tibble(cmp)` for the full table
(`as_tibble()` is never truncated).
### Group by key
Pass `group_by_key = TRUE` to render the value-diff section as one
collapsed `` block per key value, sorted by number of diffs
(most-affected first). Useful for clinical reviews where you want to
inspect "what changed for subject X" rather than scrolling a flat
table.
```{r}
ks_report_html(cmp, "report.html", group_by_key = TRUE, max_groups = 100)
```
When `dup_keys = "keep_all"` or `"all_pairs"` was used in
[ks_compare()], each key block also shows a *Pair* column so you can
tell duplicate-row pairings apart. If no `by =` was supplied (row-
position match), `group_by_key` is silently ignored.
## Excel
```{r}
ks_report_xlsx(cmp, "report.xlsx")
```
Sheets:
- `Summary` -- headline counts.
- `Schema` -- per-column metadata diff.
- `KeyDiff` -- matched / base-only / comp-only row counts.
- `Values` -- long cell-level diff table.
- `DiffCauses` -- grouped causes of cell differences.
- `RowHotspots` -- matched rows with the most changed cells.
- `Patterns` -- detected recurring shapes (empty unless the comparison
was run with `find_patterns = TRUE`).
- `UnmatchedRows` -- full base-only / comp-only rows stored on the
comparison object.
- `FirstLastUnequal` -- first / last differing observations per matched
column.
- `OUT_BASE`, `OUT_COMP`, `OUT_DIF`, `OUT_NOEQUAL` -- PROC COMPARE-
style wide outputs (see [as_outbase()] et al.).
- `Manifest` -- input hashes, package version, run timestamp.
Numeric `OUT_DIF` cells whose magnitude exceeds `threshold` (default
`0`) are highlighted via openxlsx2 conditional formatting. Pass
`highlight = FALSE` to suppress.