| Title: | Linked Selection Across Aggregate Views |
|---|---|
| Description: | Brush a row-level display and see aggregate displays fill in proportion to the rows selected, with the row-to-group mapping retained. Aggregate views such as bar charts summarise many rows into one mark, so a selection made on individual rows is resolved back through the row to group mapping to fill each mark partially. Output is an 'htmlwidget' that works inside 'shiny' or as a single self-contained HTML file with no server, so an interactive figure can be archived or shared like a static one. |
| Authors: | Renit Anthony [aut, cre], Mike Bostock [ctb, cph] (d3.js library in inst/htmlwidgets/lib, ISC licence) |
| Maintainer: | Renit Anthony <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.1.0 |
| Built: | 2026-10-11 15:30:34 UTC |
| Source: | https://github.com/renit12345-ship-it/linkagg |
Builds the htmlwidget. Save it with htmlwidgets::saveWidget() and
selfcontained = TRUE to get a single HTML file that opens offline with no
server, which is the point of the package.
as_linkagg_widget( spec, width = NULL, height = NULL, caption = NULL, stamp = TRUE, elementId = NULL )as_linkagg_widget( spec, width = NULL, height = NULL, caption = NULL, stamp = TRUE, elementId = NULL )
spec |
A |
width, height
|
Widget dimensions. |
caption |
Optional free text shown in the footer, for example the dataset and any subset applied. |
stamp |
Add a provenance line recording the render time, package version, row count and per-arm denominators. Keep this on for anything you intend to share or archive. |
elementId |
Optional DOM id. |
An object of class htmlwidget.
Begins a specification. Add displays with view_points(), view_bars() and
view_table(), then render with as_linkagg_widget().
linkagg( data, key, threads = TRUE, thread_cap = 160L, points = c("auto", "svg", "canvas"), canvas_threshold = 6000L, palette = NULL )linkagg( data, key, threads = TRUE, thread_cap = 160L, points = c("auto", "svg", "canvas"), canvas_threshold = 6000L, palette = NULL )
data |
A data frame with one row per unit of selection. For clinical safety use this is a subject-level dataset such as ADSL, one row per subject, restricted to the analysis population. |
key |
Column uniquely identifying each row, such as |
threads |
Draw animated threads from selected rows to the groups they
belong to. This is what makes the row-to-aggregate mapping visible. Set
|
thread_cap |
Maximum threads drawn. Above this, threads are sampled evenly so the display stays legible. |
points |
Renderer for the row-level display: |
canvas_threshold |
Row count above which |
palette |
Named list of colours overriding the default light theme.
Recognised names: |
An object of class linkagg_spec.
set.seed(1) adsl <- data.frame( USUBJID = sprintf("01-%03d", 1:120), ARM = rep(c("Placebo", "Drug A 50mg", "Drug A 100mg"), each = 40), ALT = exp(rnorm(120)), TBILI = exp(rnorm(120)) ) adsl$SOC <- replicate(120, sample(c("Hepatobiliary disorders", "Investigations", "Gastrointestinal disorders"), sample(0:3, 1)), simplify = FALSE) linkagg(adsl, USUBJID) |> view_points(TBILI, ALT, log_x = TRUE, log_y = TRUE) |> view_bars(SOC, by = ARM) |> view_table(cols = c("USUBJID", "ARM", "ALT", "TBILI"))set.seed(1) adsl <- data.frame( USUBJID = sprintf("01-%03d", 1:120), ARM = rep(c("Placebo", "Drug A 50mg", "Drug A 100mg"), each = 40), ALT = exp(rnorm(120)), TBILI = exp(rnorm(120)) ) adsl$SOC <- replicate(120, sample(c("Hepatobiliary disorders", "Investigations", "Gastrointestinal disorders"), sample(0:3, 1)), simplify = FALSE) linkagg(adsl, USUBJID) |> view_points(TBILI, ALT, log_x = TRUE, log_y = TRUE) |> view_bars(SOC, by = ARM) |> view_table(cols = c("USUBJID", "ARM", "ALT", "TBILI"))
The current selection is reported as input$<outputId>_selected, a character
vector of key values, or NULL when nothing is selected.
linkaggOutput(outputId, width = "100%", height = "760px") renderLinkagg(expr, env = parent.frame(), quoted = FALSE)linkaggOutput(outputId, width = "100%", height = "760px") renderLinkagg(expr, env = parent.frame(), quoted = FALSE)
outputId |
Output variable name. |
width, height
|
Passed to the container. |
expr |
An expression producing a |
env |
Environment in which to evaluate |
quoted |
Is |
linkaggOutput() returns a Shiny output element;
renderLinkagg() returns a Shiny render function.
Launches a small app showing the figure wired into Shiny, with the current
selection read back in R from input$fig_selected and summarised below the
figure. Use it as a working reference for the Shiny bindings, which are
documented at linkagg-shiny.
run_linkagg_app(...)run_linkagg_app(...)
... |
Passed to |
Called for its side effect of running the app.
if (interactive()) { run_linkagg_app() }if (interactive()) { run_linkagg_app() }
One bar per group, each standing for many rows. When a selection is active each bar fills to the share of its own rows that are selected, which is the behaviour existing linked-brushing tools in R do not provide.
view_bars( spec, group, by = NULL, drill = NULL, group_levels = NULL, by_levels = NULL, denominator = c("population", "count"), population = NULL, max_bars = 12L, label = NULL )view_bars( spec, group, by = NULL, drill = NULL, group_levels = NULL, by_levels = NULL, denominator = c("population", "count"), population = NULL, max_bars = 12L, label = NULL )
spec |
A |
group |
Grouping column. Either an ordinary column with one value per row, or a list-column where each element is a character vector, for rows in several groups at once, such as a subject with events in several system organ classes. |
by |
Optional column giving the treatment arm, one value per row. |
drill |
Optional finer terms to drill into, given coarse to fine. One
column drills a single level, such as preferred term below system organ
class; several give a hierarchy, Every drill column must be shaped like |
group_levels |
Optional character vector fixing the order of groups. Defaults to descending overall count. |
by_levels |
Optional character vector fixing the order of arms. Defaults to the factor levels, or sorted unique values. |
denominator |
|
population |
Denominator source. |
max_bars |
Most bars to draw at any one level, largest first. Drilling
into a system organ class can turn up dozens of preferred terms, most of
them seen in one or two subjects, and drawing all of them buries the
terms worth reading. Terms beyond the cap are counted in a note under the
display rather than dropped silently. Set |
label |
Display title. Defaults to the column name. |
Supply by to split every group by treatment arm, which is how safety
displays are actually read. With by set, bar length is the percentage of
that arm's analysis population, matching the denominator convention of a
standard adverse event summary. Without by, bar length is a raw count.
The updated linkagg_spec.
Bins a continuous column and draws it as an aggregate display. This is the case crosstalk's documentation names as unsupported, since each bar stands for many rows. Here a selection fills each bar from the baseline up, in proportion to the rows of that bin which are selected.
view_hist( spec, x, bins = 24L, by = NULL, log = FALSE, denominator = c("count", "population"), population = NULL, label = NULL )view_hist( spec, x, bins = 24L, by = NULL, log = FALSE, denominator = c("count", "population"), population = NULL, label = NULL )
spec |
A |
x |
Numeric column to bin. Bare name or string. |
bins |
Number of equal-width bins. |
by |
Optional treatment arm column, drawn as one series per arm. |
log |
Bin on the log10 scale, for skewed measures such as lab ratios. Non-positive values are dropped, and the count of dropped rows is checked rather than passed over silently. |
denominator |
|
population |
Denominator source, as in |
label |
Display title. Defaults to the column name. |
The updated linkagg_spec.
One mark per row, and the display you brush to make a selection. For liver safety this is the eDISH shape: peak ALT against peak total bilirubin on log scales, with a reference region.
view_points( spec, x, y, log_x = FALSE, log_y = FALSE, x_lab = NULL, y_lab = NULL, zone = NULL, facet = NULL, facet_levels = NULL, facet_row = NULL, facet_row_levels = NULL )view_points( spec, x, y, log_x = FALSE, log_y = FALSE, x_lab = NULL, y_lab = NULL, zone = NULL, facet = NULL, facet_levels = NULL, facet_row = NULL, facet_row_levels = NULL )
spec |
A |
x, y
|
Numeric columns. Bare names or strings. |
log_x, log_y
|
Use a log scale on that axis. |
x_lab, y_lab
|
Axis labels. Default to the column names. |
zone |
Optional threshold region drawn behind the data, as a list with
|
facet |
Optional column giving one small multiple per level, drawn on
shared scales so panels are comparable. Brushing acts within one panel.
With |
facet_levels, facet_row_levels
|
Optional character vectors fixing the order of columns and of rows. |
facet_row |
Optional second column, laid out down the rows to give a
full grid of panels: one column per level of |
The updated linkagg_spec.
Shows every row, and filters to the selection when one is active.
view_table(spec, cols = NULL, labels = NULL, max_rows = 400L)view_table(spec, cols = NULL, labels = NULL, max_rows = 400L)
spec |
A |
cols |
Character vector of columns to show. Defaults to all columns that are not list-columns. |
labels |
Optional column headings, same length as |
max_rows |
Rows rendered at once. The count shown is always the full selection size. |
The updated linkagg_spec.
One point per term, positioned by how much the two arms differ. The x axis
is the risk difference, the comparison arm's incidence minus the reference
arm's, in percentage points. The y axis is -log10(p) from Fisher's exact
test on that term's two-by-two table. Terms far right are more frequent on
the comparison arm, terms high up separate the arms most sharply.
view_volcano( spec, group, by, ref = NULL, comp = NULL, min_n = 2L, alpha = 0.05, label = NULL )view_volcano( spec, group, by, ref = NULL, comp = NULL, min_n = 2L, alpha = 0.05, label = NULL )
spec |
A |
group |
Term column, such as preferred term. Either one value per row
or a list-column, as in |
by |
Treatment arm column. |
ref, comp
|
Reference and comparison arm. Default to the first and last
levels of |
min_n |
Drop terms with fewer than this many subjects across the two arms. The count dropped is shown on the display. |
alpha |
Significance level for the reference line. Drawn as a guide to the eye, with no multiplicity adjustment implied. |
label |
Display title. Defaults to the column name. |
Each point stands for many subjects, so it is an aggregate mark in the sense this package is built around: with a selection active every point fills from the bottom in proportion to the share of its own subjects selected. Brushing the liver corner of an eDISH plot and reading the volcano therefore answers a question a static safety pack cannot: which adverse event signals are actually carried by those subjects.
Point area is proportional to the number of subjects contributing to the
term. A volcano plot shows an effect estimate without showing its precision,
which is its recognised weakness: a term seen in two subjects can sit as far
out as one seen in fifty. Sizing by subject count keeps that visible, and
min_n drops the sparsest terms while reporting how many were dropped
rather than passing over them silently.
The updated linkagg_spec.