Skip to contents

Attach a preset_spec to a tabular_spec, carrying page-geometry knobs (paper, orientation, margins, body font_size + family, h-rule policy, decimal metric, typography defaults). The engine consults the per-spec preset first when computing the per-page row budget, decimal-aligned column widths, and the chrome that the backend renders around the body grid.

Usage

preset(.spec, ..., .template = NULL, .style = NULL, .reset = FALSE)

Arguments

.spec

The tabular_spec to attach the preset to. <tabular_spec>: required. Dot-prefixed so R's partial argument matching cannot accidentally bind a knob name in ... to the spec slot.

...

Named preset knobs. Any subset of the preset knobs the preset_spec class carries. Knob values are validated against the class's enum / length / type rules; bad values raise tabular_error_input. Unknown knob names raise tabular_error_input with the recognised set listed.

Recognised knobs:

  • font_size — body point size. <numeric(1)>.

  • font_family — body font family. <character | character(1)>. Default "mono". Three accepted shapes:

    1. Generic family"mono" (default), "serif", "sans" (CSS aliases "monospace" / "sans-serif" also recognised). The resolver expands to a per-backend chain that leads with the Linux-installed Liberation face (Posit Workbench / Domino / Citrix / RStudio Server), then the Microsoft Office face (Courier New / Times New Roman / Arial) for desktop Win / Mac consumers, then TeX Gyre for LaTeX compile, then the CSS generic for HTML. Liberation Mono / Serif / Sans are metric-compatible with Courier New / TNR / Arial, so layout, line breaks, and decimal alignment hold across every render context. The mono default matches the dominant submission-TFL convention where deterministic glyph widths drive n (%) cell alignment.

    2. Named alias"Times", "Times New Roman", "Arial", "Helvetica", "Courier", "Courier New". These PostScript-era names alias to the appropriate generic family (Times -> serif, Arial / Helvetica -> sans, Courier -> mono) and emit the same expanded chain. Honours the user's intent ("I want Times-like rendering") on every OS instead of hard-erroring on a Linux server with no TNR installed.

    3. Named font"Inter", "JetBrains Mono", "Source Serif Pro", sponsor-specific face, etc. Emitted verbatim with no fallback fabricated. The consuming app (browser, xelatex, Word, LibreOffice) resolves the name against its own font matcher. RTF and DOCX fall back to the consuming app's substitution table when the name is missing; xelatex hard-errors at compile time; HTML browsers fall through to the browser's default font (not necessarily class-matched).

    4. Explicit stackc("Inter", "Helvetica", "sans"). User owns the chain. Returned verbatim — alias lookup is bypassed, so c("Times", "Times") honours the exact name with no chain expansion (escape hatch for users who genuinely want exact-name semantics).

    Note: Adobe Source Pro is no longer the default lead. Source Pro is not pre-installed on production Linux servers, so leading with it walks through 2-3 missing names before resolving. Users who installed Source Pro can opt in via the explicit-stack form (c("Source Serif Pro", "serif")).

    What you see in Word's font dropdown vs. what renders. When you open a tabular-generated .rtf in Word on macOS or Windows, the font dropdown displays the file's requested face — "Liberation Mono" by default (the Linux-server-installed face). The rendered text on screen is whatever Word's \\*\\falt substitution resolved to — typically Courier New on macOS / Windows. This is correct: Liberation Mono and Courier New are metric-compatible by design, so the rendered layout (line breaks, decimal alignment, page breaks) is identical regardless of which face Word actually used to render. The same \\*\\falt substitution model applies to serif (Liberation Serif -> Times New Roman) and sans (Liberation Sans -> Arial).

    How to force Office names as the primary. If reviewers will be confused by seeing "Liberation Mono" in the Word font dropdown (cosmetic concern; doesn't affect rendering), pass an explicit length>1 stack with the Office name first. The resolver returns the vector verbatim — no alias lookup, no chain expansion — so the RTF file then names the Office face as primary and your chosen alternate as \\*\\falt:

    preset(font_family = c("Courier New", "Courier", "Liberation Mono"))

    This is the canonical escape hatch for authors who know their consumer audience is Mac / Windows Word users and want the dropdown to show the Office face directly.

  • orientation — page orientation. <character(1)>. One of "landscape" (default), "portrait".

  • paper_size — paper key. <character(1)>. One of "letter" (default), "a4".

  • margins — page margins in inches. <numeric(1) | numeric(4)>. Length 1 = all four sides; length 4 = top, right, bottom, left.

  • pagehead, pagefoot — per-page header / footer band content. <list>. Each band is a named list with slots from left / center / right; every other slot name is rejected. Each slot accepts NULL (omit), a character scalar, a character vector (multi-row content), or an inline_ast. Empty list() (the default) -> no band emitted.

    Single-row form (scalar slots):

    pagehead = list(
      left   = "Protocol: ABC-123",
      center = "Draft",
      right  = "Page {page} of {npages}"
    )

    Multi-row form (vector slots, index-aligned):

    pagehead = list(
      left  = c("Protocol: ABC-123", "Analysis Set: Safety"),
      right = "Page {page} of {npages}"   # scalar -> body-edge row
    )

    Growth direction. Vector index 1 = body edge; index N = far from body. pagehead rows stack upward away from the table (the row closest to the table is index 1). pagefoot rows stack downward away from the table (the row closest to the table is index 1). Shorter slots pad with "" at the FAR end (high index), so a scalar slot naturally lands on the body-edge row.

    Token vocabulary — substituted into slot text:

    TokenPhaseExpansion
    {page}backendcurrent page number (field code)
    {npages}backendtotal page count (field code)
    {program}enginecalling script's base name
    {program_path}enginecalling script's full path
    {datetime}engineDDMMMYYYY HH:MM:SS UTC (render time)

    {program}, {program_path}, and {datetime} resolve once per render (at as_grid() / emit()); {page} and {npages} resolve per page (filled in by Word / xelatex / the browser's print engine at view time). The program tokens walk a 5-mode detection chain — RStudio API, source() frame, Rscript / R CMD BATCH commandArgs (covers Domino + Linux batch + CI), knitr current_input, fallback "<interactive>".

  • rules — the single border vocabulary (replaces the old borders knob). String sugar "booktabs" (default, the clinical baseline), "grid", "frame", "none"; a single brdr() broadcast to every active rule; or a named list keyed by the nine rule names (toprule, midrule, bottomrule, spanrule, rowrule, footnoterule, leftrule, rightrule, colrule) — unlisted rules keep their default, and the bare string "none" drops one. rules = list(rowrule = brdr()) reproduces the old hlines = "all".

    bottomrule vs footnoterule. These are mutually exclusive: exactly one rule sits at the data -> footnote boundary. The default is bottomrule (the table's bottom edge); footnoterule (a table-width rule opening the footnote section) is OFF by default. As a distinct footnote-section rule, footnoterule is drawn only by the paginated backends — RTF, LaTeX / PDF, and DOCX. The HTML backend is continuous (non-paginated) and has no separate footnote section, so it folds both into one rule: whichever of bottomrule / footnoterule is active becomes the table's bottom edge (bottomrule wins when both are set). Setting footnoterule therefore still draws a closing rule on HTML — rendered as the bottomrule.

  • spacing — region-keyed blank-line control. A named list keyed by title / body / subgroup / footnote, each a named numeric c(above = , below = ) (footnote: above only). Default is the one blank line above and below the title block. Two adjoining region-sides that target the same physical gap resolve to the MAX (never the sum), so a gap is never accidentally doubled.

  • stripe — zebra body-row fills. A single colour (applied to even rows) or a named c(odd = , even = ); NULL (default) is off.

  • indent_size — row-label indent width, in monospace- space units. <integer(1)>. Default 2L. Each indent level adds this many space-widths of left padding to the cell. 0L disables the indent prefix entirely. Backends with native padding-left semantics (HTML / LaTeX / RTF / DOCX / PDF) emit this as cell padding so wrapped continuation lines align with the indented baseline; Markdown carries the literal space-prefix. Block alignment for the title / footnote / header / subgroup / body surfaces is set via the alignment named-list knob (alignment = list(title_halign = "left", ...)), not a scalar knob; blank-line spacing is set via spacing (above).

  • na_text — global NA fallback. <character(1)>.

  • decimal_metrics — decimal-padding metric. <character(1)>. "afm" (default) measures glyphs with the bundled Core font metrics, so decimal columns align width-exact in proportional fonts (to within one padding space of rounding; exact in Courier). "chars" pads by character count — exact in monospaced faces only. Markdown output always pads by character count, the correct geometry for a text medium.

  • decimal_markers — missing-value tokens recognised by col_spec(align = "decimal"). <character>. Default c("NR", "NE", "NC", "ND", "BLQ"). A cell whose trimmed value is one of these is treated as a non-numeric marker: it is shown and right-aligned in the column rather than parsed as a number, and a marker appearing inside a compound (e.g. the upper bound of 14.3 (11.2, NR)) is preserved and slot-aligned. Excludes "-", "NA", and "INF"/"-INF" by default: "-" collides with range separators, "NA" is handled by na_text, and infinities are real values. Set to character(0) to disable marker handling.

  • width_mode — table-level column-sizing policy. Mirrors Word's Table Layout menu. <character(1)>. One of:

    • "content" (default) — Each column auto-sized to max(body, header). The table doesn't fill the page. Word's "Auto-fit Contents".

    • "window" — Auto-sized columns expand to share the residual page width equally. Pinned and percent columns keep their pins. Word's "Auto-fit Window".

    • "fixed" — Only explicit per-column widths drive the layout. Auto-sized columns collapse to a minimum sliver. Word's "Fixed Column Width".

    Interaction: Pair with col_spec(width = ...) pins to drive the layout under "window" / "fixed". Under "content", pins still take priority over auto columns.

    HTML backend. width_mode drives paper backends (LaTeX / RTF / PDF / DOCX) only. HTML is unconditionally responsive — the table always fills its parent and columns wrap when the viewport narrows, regardless of width_mode. Per-column widths (col_spec(width)) emit verbatim into the HTML colgroup per the gt convention.

  • whitespace — how significant ASCII spaces in labels and cells render. <character(1)>. One of:

    • "preserve" (default) — leading, trailing, and interior runs of 2+ spaces become the backend non-breaking token (&nbsp; / ~ / \~; DOCX preserves via xml:space), so a hand-built indent like col_spec(label = " Placebo") renders verbatim across every backend. A single interior space stays breakable, so cells still wrap.

    • "collapse" — leave the backend's native run-folding in place (HTML / md / LaTeX collapse runs to one space).

    Note: never affects col_spec(align = "decimal") padding, which uses U+00A0 and is preserved unconditionally.

  • footnote_markers — the glyph scheme for footnote() markers, which the engine allocates once in reading order. <character(1)>. One of:

    • "letters" (default)a, b, …, z, aa, ab, … (bijective base-26).

    • "numbers"1, 2, 3, …

    • "symbols" — Lamport's sequence *, , , §, , , then doubled (**, ††, …) once it spills past the sixth.

    Interaction: a note's anchor is fixed by footnote(); its scheme (this knob) and label (footnote_label) are resolved from the active preset at render, so flipping either re-letters every marker at once.

  • footnote_label — block-line template for a footnote() marker. <character(1)>. Default "{m}"; the {m} token is replaced by the allocated marker, so "[{m}]" prints [a] ahead of the note text on the footnote line.

  • cell_padding — cell padding in points, CSS shorthand of length 1 / 2 / 4 (all | vertical horizontal | top right bottom left), parsed by the same length rule as margins. <numeric>: default c(0, 5.4) (vertical 0, horizontal 5.4pt). The single source of truth for both auto column-width measurement (left + right) and every backend's cell margin, so measured and rendered widths agree.

    Interaction: A body per-side padding override (preset(padding = list(body = ...)) or style(.at = cells_body(), padding = ...)) takes precedence at both measurement and render.

    Note: DOCX and LaTeX render left / right exactly; RTF (\\trgaph is one symmetric gap) renders the average, so the total width still matches but the two sides look equal.

# Landscape A4, 8pt body, slim margins for one wide table.
preset(
  orientation = "landscape",
  paper_size  = "a4",
  font_size   = 8,
  margins     = c(0.75, 0.5, 0.75, 0.5)
)

.template

A preset_spec to bulk-apply before .... <preset_spec | NULL>: default NULL. When supplied, every knob the template has set away from its factory default feeds in as the base layer; user-supplied ... knobs then merge on top. List-valued knobs (rules, fonts, colors, padding, alignment) shallow-merge per key; scalars replace. Use this to layer a house-style preset_spec onto a chain without restating its knobs.

.style

A style_template() to layer onto the cascade. <style_template | NULL>: default NULL. When supplied, every layer the template has accumulated via style() is replayed in order at engine time, after the per-spec style() layers on .spec. Use this to attach a sponsor's reusable house style to a chain without restating every per-region rule.

.reset

Discard the spec's existing preset before applying .... <logical(1)>: default FALSE. When TRUE, the spec's prior preset_spec (if any) is dropped and ... knobs are merged onto fresh preset_spec() defaults. With no knobs, the per-spec preset is cleared back to NULL (the spec falls through to set_preset() or preset_spec() defaults).

Value

The updated tabular_spec. Continue chaining with paginate(), style(), then render via emit() (or resolve without I/O via as_grid()).

Details

Per-spec, chained. preset() is the per-spec override — a verb that returns a modified spec, composable on the pipe alongside cols() / headers() / paginate(). Use it when a single table needs a one-off geometry (e.g. landscape A4 for one wide efficacy summary inside a portfolio of portrait letter tables).

Merge, not replace. A second preset() call merges its scalar knobs onto the spec's existing preset; unspecified knobs keep their prior value. The five named-list knobs (alignment / rules / fonts / colors / padding) lower to style_layer records on preset@style via .preset_args_to_layers() (internal) and append in call order; layer order is precedence within the engine cascade, so a later preset() call's lowered attribute wins over an earlier one at the cell. Pass .reset = TRUE to discard the existing knobs and start from preset_spec() defaults. preset(.spec, .reset = TRUE) with no knobs clears the per-spec override entirely (the spec then falls through to set_preset() or preset_spec() defaults at render time).

Direct preset_spec() calls bypass lowering. The five named-list knobs are no longer slots on the preset_spec S7 class — they exist only as preset() / set_preset() arguments that lower into @style. preset_spec(rules = list(...)) (and analogous direct calls) raise "unused argument". Wrap such calls in tabular(...) |> preset(...) so the lowering helper fires and the layers land on @style.

Cascade with set_preset(). The engine resolves the active preset in this order: (1) the spec's per-call preset (this verb), (2) the session default attached via set_preset(), (3) preset_spec() factory defaults. The first non-NULL layer wins; layers are not field-merged across the cascade.

See also

Session-scope partners: set_preset(), get_preset().

Render-geometry consumer: paginate() derives the per-page row budget from the active preset's paper, orientation, margins, and font size.

Sibling build verbs: cols() / col_spec(), headers(), sort_rows(), style().

Entry / terminal verbs: tabular(), emit(), as_grid().

Examples

# ---- Example 1: Landscape A4 for a wide efficacy table ----
#
# BOR table where the four-arm column block fits portrait letter
# with a smaller body font, but the sponsor wants A4 landscape at
# 8pt for visual breathing room. `preset()` attaches the geometry;
# `paginate()` reads it later to size the per-page row budget.
bor_levels <- c(
  "CR", "PR", "SD", "NON-CR/NON-PD", "PD", "NE", "MISSING",
  "ORR (CR + PR)", "CBR (CR + PR + SD)",
  "DCR (CR + PR + SD + NON-CR/NON-PD)", "95% CI (Clopper-Pearson)"
)
eff <- cdisc_eff_resp
eff$stat_label <- factor(eff$stat_label, levels = bor_levels)
ne <- stats::setNames(cdisc_eff_n$n, cdisc_eff_n$arm_short)

tabular(
  eff,
  titles = c(
    "Table 14.2.1",
    "Best Overall Response and Response Rates",
    "Efficacy Evaluable Population"
  ),
  footnotes = "Response per RECIST 1.1, investigator assessment."
) |>
  cols(
    stat_label  = col_spec(label = "Response"),
    row_type    = col_spec(visible = FALSE),
    groupid     = col_spec(visible = FALSE),
    group_label = col_spec(visible = FALSE),
    placebo    = col_spec(label = "Placebo\nN={ne['placebo']}"),
    drug_50    = col_spec(label = "Drug 50\nN={ne['drug_50']}"),
    drug_100   = col_spec(label = "Drug 100\nN={ne['drug_100']}")
  ) |>
  sort_rows(by = c("groupid", "stat_label")) |>
  preset(
    orientation = "landscape",
    paper_size  = "a4",
    font_size   = 8
  ) |>
  paginate()

 

Table 14.2.1

Best Overall Response and Response Rates

Efficacy Evaluable Population

 

ResponsePlacebo
N=86
Drug 50
N=84
Drug 100
N=84
CR1 (1.2)1 (1.2)1 (1.2)
PR1 (1.2)00
SD1 (1.2)00
NON-CR/NON-PD001 (1.2)
PD001 (1.2)
NE01 (1.2)0
MISSING83 (96.5)82 (97.6)81 (96.4)
ORR (CR + PR)2 (2.3)1 (1.2)1 (1.2)
95% CI (Clopper-Pearson)(0.3, 8.1)(0.0, 6.5)(0.0, 6.5)
CBR (CR + PR + SD)3 (3.5)1 (1.2)1 (1.2)
95% CI (Clopper-Pearson)(0.7, 9.9)(0.0, 6.5)(0.0, 6.5)
DCR (CR + PR + SD + NON-CR/NON-PD)3 (3.5)1 (1.2)2 (2.4)
95% CI (Clopper-Pearson)(0.7, 9.9)(0.0, 6.5)(0.3, 8.3)

Response per RECIST 1.1, investigator assessment.

# ---- Example 2: Per-spec override with per-page chrome ---- # # The submission session sets a portrait letter 9pt default (typical # safety-table geometry). One particular AE table needs landscape # for a long PT label band; the per-spec `preset()` overrides only # orientation. The same per-spec call wires the canonical # per-page header band (protocol on the left, page X of Y on the # right) and a footer band that auto-resolves the calling # script's name and the current render timestamp via the # `{program}` and `{datetime}` tokens. set_preset(font_size = 9, paper_size = "letter") n <- stats::setNames(cdisc_saf_n$n, cdisc_saf_n$arm_short) tabular( cdisc_saf_aesocpt, titles = c( "Table 14.3.1", "Adverse Events by System Organ Class and Preferred Term", "Safety Population" ), footnotes = "Subjects are counted once per SOC and once per PT." ) |> cols( label = col_spec(label = "SOC / PT", indent = "indent_level"), soc = col_spec(usage = "group", visible = FALSE, group_display = "column_repeat"), row_type = col_spec(visible = FALSE), soc_n = col_spec(visible = FALSE), n_total = col_spec(visible = FALSE), placebo = col_spec(label = "Placebo\nN={n['placebo']}"), drug_50 = col_spec(label = "Drug 50\nN={n['drug_50']}"), drug_100 = col_spec(label = "Drug 100\nN={n['drug_100']}"), Total = col_spec(label = "Total\nN={n['Total']}") ) |> headers("Treatment Group" = c("placebo", "drug_50", "drug_100", "Total")) |> sort_rows(by = c("soc_n", "n_total"), descending = c(TRUE, TRUE)) |> preset( orientation = "landscape", pagehead = list( left = "Protocol: ABC-123", right = "Page {page} of {npages}" ), pagefoot = list( left = "{program}", right = "{datetime}" ) ) |> paginate(keep_together = "soc")
Protocol: ABC-123
Page 1 of 3

 

Table 14.3.1

Adverse Events by System Organ Class and Preferred Term

Safety Population

 

Treatment Group
SOC / PTPlacebo
N=86
Drug 50
N=96
Drug 100
N=72
Total
N=254
TOTAL SUBJECTS WITH AN EVENT52 (60.5)81 (84.4)66 (91.7)199 (78.3)
SKIN AND SUBCUTANEOUS TISSUE DISORDERS19 (22.1)36 (37.5)35 (48.6)90 (35.4)
PRURITUS8 (9.3)21 (21.9)25 (34.7)54 (21.3)
ERYTHEMA8 (9.3)14 (14.6)14 (19.4)36 (14.2)
RASH5 (5.8)13 (13.5)8 (11.1)26 (10.2)
HYPERHIDROSIS2 (2.3)4 (4.2)8 (11.1)14 (5.5)
SKIN IRRITATION3 (3.5)6 (6.2)5 (6.9)14 (5.5)
GENERAL DISORDERS AND ADMINISTRATION SITE CONDITIONS15 (17.4)36 (37.5)30 (41.7)81 (31.9)
APPLICATION SITE PRURITUS6 (7.0)23 (24.0)21 (29.2)50 (19.7)
APPLICATION SITE ERYTHEMA3 (3.5)13 (13.5)14 (19.4)30 (11.8)
APPLICATION SITE DERMATITIS5 (5.8)9 (9.4)7 (9.7)21 (8.3)
APPLICATION SITE IRRITATION3 (3.5)9 (9.4)9 (12.5)21 (8.3)
APPLICATION SITE VESICLES1 (1.2)5 (5.2)5 (6.9)11 (4.3)
GASTROINTESTINAL DISORDERS13 (15.1)12 (12.5)17 (23.6)42 (16.5)
DIARRHOEA9 (10.5)5 (5.2)3 (4.2)17 (6.7)
VOMITING3 (3.5)4 (4.2)6 (8.3)13 (5.1)
NAUSEA3 (3.5)3 (3.1)6 (8.3)12 (4.7)
ABDOMINAL PAIN1 (1.2)3 (3.1)1 (1.4)5 (2.0)
SALIVARY HYPERSECRETION0 (0.0)0 (0.0)4 (5.6)4 (1.6)
NERVOUS SYSTEM DISORDERS6 (7.0)18 (18.8)17 (23.6)41 (16.1)
DIZZINESS2 (2.3)9 (9.4)10 (13.9)21 (8.3)
HEADACHE3 (3.5)3 (3.1)5 (6.9)11 (4.3)
SYNCOPE0 (0.0)5 (5.2)2 (2.8)7 (2.8)
SOMNOLENCE2 (2.3)3 (3.1)1 (1.4)6 (2.4)
TRANSIENT ISCHAEMIC ATTACK0 (0.0)2 (2.1)1 (1.4)3 (1.2)
CARDIAC DISORDERS7 (8.1)12 (12.5)14 (19.4)33 (13.0)
SINUS BRADYCARDIA2 (2.3)7 (7.3)8 (11.1)17 (6.7)
MYOCARDIAL INFARCTION4 (4.7)2 (2.1)4 (5.6)10 (3.9)
ATRIAL FIBRILLATION1 (1.2)2 (2.1)2 (2.8)5 (2.0)
SUPRAVENTRICULAR EXTRASYSTOLES1 (1.2)1 (1.0)1 (1.4)3 (1.2)
VENTRICULAR EXTRASYSTOLES0 (0.0)2 (2.1)1 (1.4)3 (1.2)
INFECTIONS AND INFESTATIONS12 (14.0)6 (6.2)11 (15.3)29 (11.4)
NASOPHARYNGITIS2 (2.3)4 (4.2)6 (8.3)12 (4.7)
UPPER RESPIRATORY TRACT INFECTION6 (7.0)1 (1.0)3 (4.2)10 (3.9)
INFLUENZA1 (1.2)1 (1.0)1 (1.4)3 (1.2)
URINARY TRACT INFECTION2 (2.3)0 (0.0)1 (1.4)3 (1.2)
CYSTITIS1 (1.2)0 (0.0)1 (1.4)2 (0.8)
RESPIRATORY, THORACIC AND MEDIASTINAL DISORDERS5 (5.8)8 (8.3)9 (12.5)22 (8.7)
COUGH1 (1.2)5 (5.2)5 (6.9)11 (4.3)
NASAL CONGESTION3 (3.5)1 (1.0)3 (4.2)7 (2.8)
DYSPNOEA1 (1.2)1 (1.0)1 (1.4)3 (1.2)
EPISTAXIS0 (0.0)1 (1.0)2 (2.8)3 (1.2)
PHARYNGOLARYNGEAL PAIN0 (0.0)1 (1.0)1 (1.4)2 (0.8)
PSYCHIATRIC DISORDERS7 (8.1)9 (9.4)3 (4.2)19 (7.5)
CONFUSIONAL STATE2 (2.3)3 (3.1)1 (1.4)6 (2.4)
AGITATION2 (2.3)3 (3.1)0 (0.0)5 (2.0)
INSOMNIA2 (2.3)0 (0.0)2 (2.8)4 (1.6)
ANXIETY0 (0.0)3 (3.1)0 (0.0)3 (1.2)
DELUSION1 (1.2)0 (0.0)1 (1.4)2 (0.8)
MUSCULOSKELETAL AND CONNECTIVE TISSUE DISORDERS3 (3.5)6 (6.2)5 (6.9)14 (5.5)
BACK PAIN1 (1.2)1 (1.0)3 (4.2)5 (2.0)
ARTHRALGIA1 (1.2)2 (2.1)1 (1.4)4 (1.6)
SHOULDER PAIN1 (1.2)2 (2.1)0 (0.0)3 (1.2)
MUSCLE SPASMS0 (0.0)1 (1.0)1 (1.4)2 (0.8)
ARTHRITIS0 (0.0)0 (0.0)1 (1.4)1 (0.4)
INVESTIGATIONS5 (5.8)4 (4.2)3 (4.2)12 (4.7)
ELECTROCARDIOGRAM ST SEGMENT DEPRESSION4 (4.7)1 (1.0)0 (0.0)5 (2.0)
ELECTROCARDIOGRAM T WAVE INVERSION2 (2.3)1 (1.0)1 (1.4)4 (1.6)
BLOOD GLUCOSE INCREASED0 (0.0)1 (1.0)1 (1.4)2 (0.8)
ELECTROCARDIOGRAM T WAVE AMPLITUDE DECREASED1 (1.2)1 (1.0)0 (0.0)2 (0.8)
BIOPSY0 (0.0)0 (0.0)1 (1.4)1 (0.4)

Subjects are counted once per SOC and once per PT.

# Reset the session default so subsequent examples / R sessions # are not affected. set_preset(.reset = TRUE)