sas_r_map: the SAS↔︎R equivalence table, 51 rows — SAS macro/PROC/DATA-step idiom → the R call that replaces it → one line on where the behaviour differs. The SAS side comes only from the public, MIT-licensed PhUSE repositories phuse-org/phuse-scripts (lang/SAS/, contributed/) and phuse-org/TestDataFactory (Code/), 75 .sas files. Rebuilt reproducibly by data-raw/sas_r_map.R, which records how many corpus files contain each idiom and refuses to write the dataset if any idiom is not found there.parity_note() is now a lookup over that data rather than a hard-coded prose table: parity_note(fn) filters by R function (exactly on this package’s displays, as a substring on r_function), parity_note(sas =) searches the SAS side with a case-insensitive regular expression, both together intersect, and a filter matching nothing errors instead of returning an empty table. Breaking: it returns eight columns (topic, sas_idiom, sas_equivalent, r_function, difference, sasparity_fn, phuse_files, phuse_example) over all 51 rows, where it previously returned two columns over five rows.tab_ae_severity() — Table 14.3.x AEs by SOC, preferred term and maximum severity, added because a published shell asks for it (PhUSE contributed/AE/AE_Severity/). Each subject is counted once per term at their worst severity via tern::count_occurrences_by_grade(); sev_levels defines the ordering and an unrecognised or missing severity value is an error rather than a silently mis-ranked row. Denominator fixed to denom = "N_col" like the other AE tables.tern/rtables cannot express in one layout call is out of scope (no efficacy, labs, vitals, exposure, shift tables, figures, or RTF/PDF rendering), as is derivation.denom remains unreachable through ...).sas_r_map’s difference column is a one-line warning, not a validation statement: it says where to look, it does not prove numerical equivalence for a given study, and no row asserts bit-for-bit reproduction of SAS.topic == "display" reference packages sasparity does not depend on (tidyr, haven, xportr, survival, mmrm, r2rtf, …). They are documentation only; nothing in this package calls them.%macro names in the six display rows (%demog, %aesumm, …) are the conventional sponsor-side names and are illustrative — the PHUSE corpus evidences the PROC idiom beside them, not the macro name.tab_disposition() still has no overall (“All Patients”) column, unlike the other tables.data-raw/sas_r_map.R needs a local copy of the two PHUSE repositories to re-run; the built dataset is shipped, the corpus is not.Initial development version.
tab_demographics() — Table 14.1.x demographics/baseline characteristics: one call over adsl, statistics chosen automatically by variable type via {tern}’s analyze_vars().tab_disposition() — Table 14.1.x subject disposition, same mechanism applied to EOSSTT/DCSREAS.tab_ae_summary() — Table 14.3.1 AE overview counts (any / serious / related / fatal), each subject counted once per criterion, denominator fixed to the adsl-sourced population (denom = "N_col") rather than {tern}’s record-level default.tab_ae_soc() — Table 14.3.2 AEs by system organ class and preferred term; subject-level counts at both the SOC and PT level via {tern}’s summarize_num_patients()/count_occurrences().lst_ae() — Listing 16.2.x adverse event listing, one row per AE record.parity_note() — the single source of truth mapping each function to the SAS macro/PROC idiom it replaces; every tab_*()/lst_*() object carries the same string in $sas_equivalent.sasparity_example() — small self-contained adsl/adae fixtures bundled in inst/extdata so every example/test runs without {pharmaverseadam}.sasparity_table with a shared print() method showing the SAS equivalent and the denominator note alongside the table.