Skip to content

Product manual (generated)

metaproc — Product Manual & Feature Inventory

Section titled “metaproc — Product Manual & Feature Inventory”

Last reviewed against source on 2026-05-31 (commit 82f983a). This is a factual inventory generated by reading every R module; companion document CODE_REFERENCE.md reproduces the exact R code behind every model, figure, and graphic for correctness auditing.


A button-driven application for frequentist meta-analysis, in the browser or on the desktop, built as an R Shiny app (golem package, bslib/Bootstrap 5 UI). It is button-driven and template-based — the intended user is a researcher, not an R programmer.

The defining principle — “SAS-like” reproducible code capture

Section titled “The defining principle — “SAS-like” reproducible code capture”

Every model, table, figure, and graphic in the app is produced by building R code as text from the user’s choices, evaluating that exact text, and displaying the same text in a copyable code panel. What you see in the “R code” panel is — by construction — what actually ran. This is implemented uniformly: each template has a build_code() generator that returns a $display string (shown) and a $model string (evaluated); the two are assembled from the same pieces. See CODE_REFERENCE.md for the verbatim generators. The only outputs not governed by a user-visible code panel are the four appraisal/QC computations noted in §6.4 and the in-app diagnostic helper panels (heterogeneity panel, interpretation, caveats) which are rendered HTML summaries rather than re-runnable code.

PurposePackageWhere
Pairwise pooling, diagnostics, 3-levelmetafor (escalc, rma, rma.mh, rma.peto, rma.glmm, rma.mv)Templates, Pipeline
Network meta-analysisnetmeta (pairwise, netmeta)Network
Risk-of-bias figuresrobvisAppraise → Risk of bias
Effect-size conversionescTools → Converter
Report renderingrmarkdown (+ Quarto’s bundled pandoc)Report
Power, GRADE, SWiM, PRISMAbase R (hand-implemented formulas / base graphics)various

Note: the meta package is a locked dependency but pairwise pooling stays on metafor. Mantel-Haenszel / Peto are done via metafor’s rma.mh / rma.peto.


Motion (inter-tab transitions, plot-render shimmer loaders, value-box count-up) is gated behind prefers-reduced-motion. Icon-only controls and the ⓘ info-tips carry ARIA labels and are keyboard-operable (Enter/Space); slide-out panels are role="dialog"; focus shows a consistent :focus-visible ring. Body text meets WCAG-AA contrast on the Orbital theme. A navbar colourblind-safe switch swaps the plot palette — the static forest (study squares/CIs) and funnel contour shading, the ggiraph forest/funnel, the EDA plots (distributions / missingness / correlations / by-group / scatter), SWiM harvest, PRISMA flow, and leave-one-out — to the Okabe–Ito set. A navbar light/dark toggle recolours the entire UI (page canvas, sidebars, cards, panels, tables, chips, inputs) via a scoped [data-bs-theme="dark"] palette with a reduced-motion-safe crossfade, while plots keep a white publication “paper”; the UI font is a modern sans-serif with a robust offline fallback (never a browser serif). (A full axe/Lighthouse + screen-reader audit is still recommended.) A first-run guided tour (Import → EDA → Templates → Report; dismissible, re-openable from Help) and one-click worked examples ease new users in.

From app_ui.R (bslib::page_navbar, id main_nav). The clickable title returns to Home.

#ItemTypeModule
1Homepanelmod_home
2Datapanelmod_data_import
3Combinepanelmod_combine
4Planpanelmod_planner
5EDApanelmod_eda
6Templatespanelmod_templates
7Networkpanelmod_network
8Pipelinepanelmod_pipeline
9AppraisemenuRisk of bias (mod_rob), GRADE (mod_grade), SWiM (mod_swim)
10ReportmenuReproducible report (mod_report), PRISMA 2020 flow (mod_prisma)
11ToolsmenuEffect-size converter (mod_esc), Power analysis (mod_power)
12Workspacebuttontoggles the slide-out dataset switcher
13Guidepanelmod_guide
14Aboutpanelmod_landing
15Helplinkquick-help modal

Global chrome: floating zoom/scale control (root-rem based, persists in localStorage); slide-out Workspace panel listing every loaded file/sheet with row×col counts (click to switch active dataset app-wide); slide-out glossary info-panel (102 plain-language term definitions opened by ⓘ icons — the most-used deepened with worked examples + cautions; ~76 placed across tabs); scroll-down cue; keyboard nav (Ctrl+←/→ cycle tabs, Backspace back / Shift+Backspace forward).

Theme (app_theme.R + inst/app/www/custom.css): Bootstrap 5 in the “Orbital” brand (teal → emerald; see C:\dev\metaproc-deploy\design\BRAND.md, the locked source of truth). Primary is an AA-safe deep teal #0A7A68; secondary a muted slate #5B6877; amber-deep #D97706 is the on-brand warning accent. The default warm-light mood uses a warm parchment canvas #F3F0E9 (deliberately never pure white) with soft teal/emerald radial tints and a dark blue-slate ink #19222C; the navbar light/dark toggle switches to deep dusk (canvas #060A11, dusk surfaces #141C25/#18222B) scoped under [data-bs-theme="dark"]. Two mood-paired accents (shared amber + a partner — violet in dusk, coral in light) carry active-state and informational highlights. Code/results panels stay a dark navy (#0D141B bg, teal-tinted #9FE8DC text) in both moods as a contrast anchor. Fonts Inter (UI + headings) + IBM Plex Mono (code). All decorative motion respects prefers-reduced-motion and the in-app Motion toggle. The plot palette (mp_plot_palette()) follows suit — teal #0E9F8E / deep teal #0A7A68 / amber #E08A00 — while the colourblind-safe Okabe–Ito palette is unchanged.


Exists:

  • Upload CSV / XLS / XLSX, or load a bundled example (example_pairwise.csv).
  • Multi-sheet Excel: every worksheet is read and added to the Workspace under the key "<file> — <sheet>"; switchable from the Workspace panel or the in-tab picker.
  • Automatic header detection for extraction-template workbooks (mp_detect_header): scans the first 12 rows, picks the row with the most filled cells as the header, and detects a following “instructions/type” row (Dropdown: / Integer / e.g. …) to drop. Manual override controls: “Header is on row”, “Drop rows after header”, “Auto-detect” — per sheet.
  • Junk-column drop (readxl ...N auto-names) and blank-row drop.
  • Value boxes: rows / columns / missing values.
  • DT preview rendered fresh per dataset (survives 0-row sheets and column-count changes); per-column filters when ≤40 columns; horizontal scroll for wide sheets.
  • Data-overview histogram/barplot of any column + its plot code.
  • Duplicate study-ID detection (unit-of-analysis warning).
  • Biological-range checks (see §7) and Consistency rules builder (see §7), both with reproducible code, both toggleable via qc.yml.
  • Import code panel (exact read.csv / read_excel(...) shown); Clear button; CSV download of the active dataset.
  • Edit / clean data card: an editable grid (cell edits coerce to the column type and write back to the active dataset), per-column retype (numeric/integer/character/factor)
    • rename, and row include/exclude (drops rows so EDA/Templates see fewer) — each emitting its exact R (code-capture). Degrades safely on 0-row and very wide sheets.

Does NOT exist: flip/transpose; paste-from-clipboard import; database/URL/API import; .sav/.dta/.RData import; encoding selection.

Exists: join columns across worksheets into one analysis table — base sheet + merge-in sheets; auto-detected, user-editable join keys (from a key vocabulary: study_id, intervention, arm, timepoint…); left / inner / full join; per-sheet key + column pickers; grain guard (warns when a repeated-measure column is not a key and offers “Add to key”); filter-before-join (closest / max / min / first-non-missing per group) to prevent fan-out; fan-out warning naming the inflating IDs; colliding columns prefixed by sheet name; generated merge() code; CSV download; “Use as active dataset”. A Combine mode toggle also offers stack / row-bind (concatenate studies: union of columns, missing filled NA, a .source origin column) with its generated code.

Does NOT exist: fuzzy/approximate key matching; many-to-many resolution beyond the filter rules.

Exists, six views, each with its plot R code: Summary (per-variable type/N/missing/unique/mean/SD/min/median/max DT); Distributions (histogram with bins slider + log10 toggle; numeric-looking text auto-coerced; barplot for categoricals); Missingness (per-column missing bar); Correlations (Pearson/Spearman heatmap with cell values); By group (boxplot by a categorical); Scatter (with optional lm trend line, plus an opt-in Interactive ggiraph hover view). All plots are resizable (drag a corner) and full-screen-expandable (⛶); in-plot fonts scale with the panel/zoom size and render in sans-serif.

Does NOT exist: outlier tests, normality tests, time-series/longitudinal EDA, pairs-plot matrix, interactive hover on views other than Scatter, export of EDA plots as files (EDA plots are on-screen only; only their code is copyable).


4. Analysis templates (Templates tab, mod_templates + fct_templates)

Section titled “4. Analysis templates (Templates tab, mod_templates + fct_templates)”

Eleven config-driven templates. Each declares column roles (auto-guessed from names, user-mappable) and options, then generates + runs metafor code.

#TemplateEffect measuresPooling / model specials
1Pairwise — binary (2×2)RR (default), OR, RDInverse-variance / Mantel-Haenszel / Peto; flip direction; zero-cell warning
2Pairwise — continuousSMD (default, Hedges’ g), MD, ROMflip direction
3Single-group proportionPLO logit+CC (default), GLMM (no CC), Freeman-Tukey PFT, raw PRboundary-rate switch to GLMM
4CorrelationFisher’s z (ZCOR)
5Pre-computed (yi/SE)none / exp display transform
6Single-group incidence rateIRLN (default), IR
7Single-group meanMN (default), MNLN
8Three-level (rma.mv)none / expnested random effects; REML/ML only (no Knapp-Hartung); opt-in cluster-robust SEs (RVE: CR2 + Satterthwaite df, clubSandwich)
9Time-to-event — hazard ratio (HR)log-HR + SE → HR (exp, null = 1)pools per-study log-HR + SE; pair with the HR converter for reported HR + 95% CI
10Two-group incidence-rate ratio (IRR)IRR (exp, null = 1)event counts + person-time per group via escalc("IRR")
11Change from baseline (pre/post)MC (raw) / SMCC (standardized)change-score SD from an imputed, flagged pre-post correlation ri (+ sensitivity note)

Shared model options (all templates except the three-level model): τ² estimator — REML (default), Paule-Mandel, DerSimonian-Laird, ML, Empirical Bayes, Sidik-Jonkman, or common-effect (FE); Knapp-Hartung adjustment (default ON, auto-greyed under the common-effect/FE model where it has no role); confidence level.

Per-run outputs (all exist):

  • Value boxes: pooled estimate + CI (back-transformed), I², k.
  • Forest plot tab — interactive controls: prediction interval on/off (default on), sort (default / effect size / precision), custom x-axis label; the live forest() call is shown; export PNG / PDF / SVG. An Interactive toggle (default off) adds a ggiraph (SVG) forest with per-study hover tooltips (study, estimate, CI, weight); the static metafor plot + its code stay the default/export.
  • Funnel plot tab (contour-enhanced); same opt-in Interactive (ggiraph) hover view.
  • Heterogeneity panel: K, total N, Cochran’s Q (df, p), I² with 95% CI, τ² with 95% CI, τ, H², 95% prediction interval.
  • Per-study estimates table (Study, Estimate, CI, Weight %) + CSV download.
  • Plain-language interpretation (effect, significance vs null, heterogeneity band, caveat).
  • Copyable plain-text results summary.
  • Exact R code panel + verbatim summary(fit) (the binary template’s code documents metafor’s default continuity correction, add = 1/2, to = "only0").
  • Caveat banners: zero/full-cell continuity correction, k<5 prediction interval, “judge heterogeneity from Q+I²+τ²+PI together”.
  • Weight-dominance notice (any study ≥ 50% weight; threshold in diagnostics.yml).
  • Subgroup analysis (optional): pick a categorical column and re-run → the forest plot regroups by subgroup with a pooled summary diamond per group (per-group rma) plus the overall diamond, and a panel reports the rma(mods=~g) Q-between test + per-subgroup estimates (IV templates only; the forest subtotals and the panel use the same per-group rma, so they agree).
  • Multi-arm handling: detects sub-arms (suffix / repeated id / flag column) and offers pool-within-study / independent / three-level.
  • Boundary-proportion switch: 0%/100% rates → one-click switch to GLMM.
  • Clinical translation (binary RR/OR): NNT/NNH + absolute effects (“X fewer/more per 1000”) from a user-entered baseline risk, with CIs and the exact R (code-capture).
  • L’Abbé plot (binary): each study’s treatment-arm vs control-arm risk; shown code + PNG export.

Robustness & diagnostics card (all exist): leave-one-out (table + dot plot), influence diagnostics (Cook’s distance, DFFITS, std. residual, influential flag), exclude-large-studies sensitivity (n > 10× median, configurable).

Templates does NOT include: Hartung-Knapp modified SE variants beyond test="knha"; arcsine/other proportion transforms beyond the four listed; dose-response or multivariate/multiple-outcome models (beyond 3-level + the opt-in RVE); Bayesian estimation; prediction-interval method choice (uses metafor default).


5.1 Network meta-analysis (mod_network, netmeta)

Section titled “5.1 Network meta-analysis (mod_network, netmeta)”

Exists: arm-level data → pairwise()netmeta(); outcome type binary (OR/RR) or continuous (SMD/MD); reference-treatment picker (auto-prefers placebo/control); network plot, forest vs reference, summary, league table, P-score rankings, net-split (direct vs indirect inconsistency), comparison-adjusted funnel; exports network PNG / forest PNG / league CSV; exact R code panel; bundled example_network.csv.

Does NOT exist: Bayesian NMA; node-splitting beyond netsplit; SUCRA plots (P-scores only, shown as text); network meta-regression; component NMA; ranking-probability rankograms; design-by-treatment interaction model.

5.2 Pipeline (mod_pipeline + fct_pipeline)

Section titled “5.2 Pipeline (mod_pipeline + fct_pipeline)”

Exists: a 3-step builder — set base analysis (pairwise-binary mapping + measure/model), drag components into an ordered pipeline, configure each, Run; each step emits its own modular R code + text output + plot in order. Ten step types: Primary, Subgroup, Meta-regression (+bubble/regplot), Multivariable meta-regression (≥2 moderators / interactions + seeded permutest), Publication bias (funnel + small-study tests: Peters/Harbord auto-selected for OR/RR, Egger elsewhere; Begg shown), Cumulative (cumul), Leave-one-out, Influence diagnostics, Trim-and-fill (trimfill), Baujat.

Limitations: the pipeline base is hard-wired to the pairwise-binary template (mod_pipeline.R:81) — it always uses 2×2 event/total mapping and the binary escalc, regardless of what the Templates tab is set to. Continuous / proportion / etc. pipelines are not available here. Steps run against the base es/fit; there is no branching or conditional flow.

  • Risk of bias (mod_rob, robvis): RoB 2 / ROBINS-I / QUADAS-2; editable per-domain judgement dropdowns; traffic-light + summary plots; PNG export. Domains are generic D1..Dn (5/7/4) — not the named domain labels of each instrument.
  • GRADE (mod_grade): start High (RCT) / Low (observational); five downgrade factors + three upgrade factors (obs only); certainty computed by arithmetic clamp to Very low/Low/Moderate/High; value-box rating + factor table + the arithmetic shown as code. Plus a Cochrane-style Summary-of-Findings row populated from the live analysis (rv$analysis): relative + absolute effect (per 1000, from a baseline rate) + k + N + I² + the certainty rating.
  • SWiM (mod_swim): editable per-study effect-direction table (4 directions); vote counting; harvest barplot; vote-count code shown.

Appraisal does NOT include: RoB instrument-specific domain prompts/signalling questions; automatic RoB import from data; ROB-ME / ROBIS / AMSTAR; SWiM weighting beyond simple vote counts.

Exists: a real rmarkdown report built from the last Templates run (rv$analysis), output as HTML (default), PDF, or R Markdown (.Rmd) source via a format selector (the choice persists in rv$report_format). Selectable sections: Methods, PRISMA-flow bullets, included-studies table, pooled result (summary), forest plot, heterogeneity + prediction interval, reproducible R code, software/package citations. Uses Quarto’s bundled pandoc if none is on PATH; PDF renders via TinyTeX (one-time install, graceful fall-back to HTML if no LaTeX). Render errors are surfaced in the UI (notification + status alert), never a silent hang. DPI 120; error-tolerant chunks. The HTML report is fully self-contained and offline — assets are embedded and MathJax is disabled (mathjax: null; the report uses no LaTeX math), so it opens with no internet connection. The .Rmd download bundles a sibling -data.rds so it re-renders as-is. A Download reproducibility bundle button on the same tab produces a .zip — a runnable analysis.R, the dataset.csv it reads, the .Rmd, sessionInfo(), renv.lock (exact versions), and a README — that re-runs in a clean R session and reproduces the pooled estimate.

Does NOT exist / important gaps:

  • No Word (.docx) output — HTML, PDF, and .Rmd source are supported; Word is not.
  • The report’s PRISMA section is text bullets from manually typed counts; it does not embed the mod_prisma diagram.
  • Report covers the pairwise Templates analysis only — it does not pull in Network, RoB, GRADE, SWiM, or pipeline results.
  • Requires a Templates run first (no report without rv$analysis).

Exists: a PRISMA-style flow diagram drawn with base R graphics; counts auto-derived from screening/inclusion columns in the loaded data (inclusion flag, exclusion-reason, screening-stage, identified-count), with editable node labels; “included” and “reports-excluded” boxes are computed live; excluded-reasons list; PNG / SVG export.

Does NOT exist: uses base-graphics boxes, not the official PRISMA2020 / DiagrammeR template; the screening-excluded box is wired to the editable text input, not the data-computed split (see CODE_REFERENCE.md §13 for the exact wiring); not embedded in the HTML report.

  • Effect-size converter (mod_esc, esc + closed-form): 12 conversions → effect + SE
    • exact code — group means/SDs/Ns, independent t, one-way F (2 groups), χ²(df=1), 2×2 table, point-biserial r, unstandardized B, standardized β, two proportions, and (Phase 8) HR + 95% CI → log-HR + SE (Tierney 2007), median/IQR/range → mean & SD (Wan 2014 / Luo 2018; three scenarios), and a cluster-RCT design-effect adjustment (SE inflated by √DEff, DEff = 1+(m−1)·ICC). Inputs are validated (clear message on a bad CI ordering / out-of-range ICC). All but the 2×2 and proportions return Hedges’ g (es.type="g").
  • A-priori power (mod_power): power for random-effects vs common-effect models given K / N-per-group / expected SMD / heterogeneity band / α, plus a power-vs-K curve with an 80% target line. Formulas hand-implemented (no dmetar): the heterogeneity band sets τ² = v * I²/(1 - I²) (the exact I² inversion → variance inflation 1/(1 - I²), shown in-panel) — more conservative than dmetar’s fixed 1.33/1.67/2.0 multipliers at higher I².

Tools does NOT include: sample-size/MDES solving (power is forward-only, no inversion to required K); converter coverage of log-rank O−E/V → log-HR, or correlation-matrix conversions (HR + 95% CI, medians/IQR/range → mean & SD, and the cluster design-effect SE adjustment are now covered — see above).

5.7 Plan wizard (mod_planner) and Guide (mod_guide)

Section titled “5.7 Plan wizard (mod_planner) and Guide (mod_guide)”
  • Plan: PICO inputs + a questionnaire (design, data type, structure, rare events, dependence, moderators, k) → mp_recommend() returns a recommended template, effect measure, model (random-effects; Knapp-Hartung when k<10), pooling (MH/Peto for rare events), a suggested pipeline, and caveats; “Apply & go” pre-selects the template on the Templates tab.
  • Guide: a PICO analysis picker and per-analysis walkthroughs that display the real generated code for 8 analyses; a “Your first meta-analysis in 5 steps” walkthrough; and one-click worked examples (binary / continuous / proportion / network) that load a bundled dataset and run it so you land on a populated result.

These are advisory/navigational — Plan/Guide do not themselves fit models, but the worked-example buttons drive a real analysis on Templates/Network.

A slim horizontal pipeline on the Home tab — Protocol → Data → Analyses → GRADE → Report — that shows, at a glance, how far the current review has progressed. It is purely additive and read-only: the status is derived from the existing in-session stores (no new persistent state, no computation), so it changes no analysis numbers and is golden-safe. The strip persists with a project .rds exactly as much as the session state it reflects.

  • Status derivation lives in mp_stepper_status() (fct_stepper.R), a pure function (no Shiny) that reads the same state the Summary-of-Findings table does: the review protocol (Plan), the active data, the outcomes list, the workflow store, per-outcome GRADE ratings, and the report blocks. Each step resolves to one of done / now (the single active frontier) / todo, plus a short status line — e.g. “Scope set”, “28 studies · 3 outcomes”, “2 of 3 run”, “1 of 3 rated”, “Not started”. With no outcomes defined yet, Analyses degrades to “any analysis run?” and GRADE reads “Needs outcomes”.
  • Navigation: each step is a real <button> that jumps to its tab (Protocol → Plan, Analyses → Templates, etc.) via the same Home goto path every other Home button uses, so it reaches menu-nested panes (GRADE, Report) by their stable pane value.
  • Styling / a11y (.mp-stepper in custom.css, Orbital skin): brand-gradient done dots and connectors, an amber active dot with a beating glow ring; per-step aria-label carrying the status, aria-current="step" on the active step, the shared :focus-visible ring, and every animation disabled under prefers-reduced-motion.

A “pick up where you left off” list on the Home tab — saved/opened projects shown as cards (a hexagonal initial badge, the project name, a meta line, and a relative time). It is client-side only (decision B4 option (a)): the list lives in the browser’s localStorage under mp-recent-projects, never on the server, so it adds no data-at-rest, no backups, and no privacy-policy obligations. The card carries the honest limitation in its copy and an explicit privacy line — “Stored only in this browser — never uploaded to the server.” (the same wording the portal uses; the two share this localStorage key, which the portal reads read-only).

  • What gets recorded — after a successful project save or load, mod_home sends the client a small metadata record via session$sendCustomMessage("mp-recent-project", …): the project name (the review protocol’s title if set, else the active dataset, else a generic fallback), the study count k (rows of the active data), the analysis kind (the latest analysis item’s measure label, when known), and an ISO-8601 timestamp. The record is built by the pure mp_recent_project_meta() (fct_recents.R) from cheap reads of existing in-session state — no model is fitted and the save/load logic itself is not touched; the notification is appended only after success, so a rejected (foreign) .rds records nothing.
  • The list (metaproc.js) — keeps the newest 8 entries, newest first, deduped by name (case-insensitive). Because a browser cannot re-read a file path (a hard security boundary), clicking a recent card re-opens the existing Load project file dialog (a real .click() on the file input, inside the user gesture) and shows a small hint — “Re-select .rds” — so reopening is one click but the user still chooses the file. A clean empty state shows when the list is empty, and a server-rendered fallback keeps the card sensible without JS.
  • Scope — purely additive chrome; it works identically in desktop and web mode (no METAPROC_MODE gating) and changes no analysis numbers (golden-safe).
  • Styling / a11y (.mp-recent-* in custom.css, Orbital skin): each card is a real <button> (so it carries the shared ripple and :focus-visible ring) with a descriptive aria-label; the hint toast is an aria-live status; the hexagonal badge is the brand mark’s shape (decorative, aria-hidden); colours ride on --mp-* tokens so the card reads in both warm-light and deep-dusk, and all motion is disabled under prefers-reduced-motion.

6. Real-world data robustness (the Phase 4 batch)

Section titled “6. Real-world data robustness (the Phase 4 batch)”

All fixture-validated against a real extraction workbook (tests/fixtures/eans_iih_extraction.xlsx).

  1. Combine grain guard + refinement-key suggestion + filter-before-join (§3.2).
  2. Multi-arm / sub-arm detection and three pooling modes (§4).
  3. Weight-dominance notice + leave-one-out / influence / exclude-large (§4).
  4. Boundary proportions — 0%/100% → logit-CC / GLMM / Freeman-Tukey switch (§4).
  5. Biological-range checks — a 30-variable clinical registry (biological_ranges.R): per-cell value-vs-typical-range (warning) and value-vs-possible-range (error) flags, to catch unit mismatches / data-entry errors (e.g. cmH₂O vs mmHg). Toggle in qc.yml.
  6. Configurable consistency rules (fct_consistency.R): a rule engine with four rule types — sum_eq_total, sum_le_total, le, range — a starter library, in-app authoring, a violations panel, YAML export, and rules saved with the project. Reproducible per-rule code shown. Toggle in qc.yml.
  7. PRISMA 2020 flow generated from screening/inclusion data (§5.5).
  8. Regression test (14 assertions across items 1–7) + glossary terms.

7. Configuration (user-extensible without editing source)

Section titled “7. Configuration (user-extensible without editing source)”

inst/config/:

  • diagnostics.ymlweight_dominance_threshold (0.5), large_study_multiplier (10).
  • grain_keys.yml — glob patterns identifying repeated-measure columns for the Combine grain guard (timepoint*, _months, visit, followup*, …).
  • qc.ymlenable_biological_ranges, enable_consistency_rules.

The biological-range registry (biological_ranges.R) and consistency starter templates (fct_consistency.R) are R data structures intended to be extended. Multi-arm flag columns are read from a multiarm config with a code default.


  • Save project.rds containing all datasets, the active dataset, and the consistency rules.
  • Load project / New project.
  • Every loaded file/sheet is remembered in the Workspace and switchable app-wide.

Does NOT persist: per-template analysis configuration (mappings/options), pipeline definitions, RoB/GRADE/SWiM/PRISMA entries, or generated reports — saving stores the data + rules, not the analysis state.


9. What metaproc is currently missing (consolidated gap list)

Section titled “9. What metaproc is currently missing (consolidated gap list)”

Packaging / distribution

  • Not yet an installable desktop binary — runs from R via shiny::runApp(run_app()). Electron shell + bundled R/packages is the planned-but-unbuilt Phase 5.
  • Dev workflow (golem::run_dev) needs devtools/pkgload/roxygen2 not in the renv lock.

Statistical scope

  • Frequentist only — no Bayesian pairwise or network MA.
  • No diagnostic test-accuracy meta-analysis (bivariate/HSROC).
  • No dose-response, multivariate/multiple-outcome (beyond 3-level), or IPD meta-analysis.
  • No robust/cluster-variance (RVE) one-click option.
  • Pipeline is locked to the binary base template (no continuous/proportion pipelines).
  • No Trial Sequential Analysis / required information size (sequential monitoring of whether the evidence base is yet conclusive).

Reporting

  • Report is HTML only (no PDF/Word).
  • Report does not include Network, RoB, GRADE, SWiM, pipeline, or the PRISMA diagram (only typed PRISMA counts as bullets).
  • No journal forest layouts (JAMA/RevMan) — would require driving pooling off the {meta} package.

Appraisal

  • RoB domains are generic D1..Dn, not instrument-named with signalling questions.
  • GRADE/SWiM are standalone calculators (no auto-import from the analysis).

Data handling

  • Imports limited to CSV/Excel (no SPSS/Stata/RData/database/URL). (In-app cell editing, column retype/rename, row include/exclude, and Combine row-bind/stacking are now available.)
  • Drag-to-resize DT column widths not available (DT lacks it natively).

Persistence

  • Saved projects store data + rules only — not analysis/pipeline/report state.

Licensing

  • The GPL-derivative concern (R + meta/metafor/netmeta/robvis/esc are GPL copyleft) was resolved 2026-06-11: metaproc itself is now GPL-3.0-or-later. Desktop installers are conveyance, so each shipped installer ships with a matching public source tag (GPLv3 section 6 Corresponding Source); hosted SaaS use is not conveyance (network use is not distribution under GPLv3). See LICENSING.md + NOTICE.

R 4.5.3 at C:\Program Files\R\R-4.5.3\bin\Rscript.exe (not on PATH). From metaproc/:

source("renv/activate.R"); library(metaproc); shiny::runApp(run_app(), launch.browser = TRUE)

Regression suite: testthat::test_dir("tests/testthat") (14 assertions, green).