Changes in version 1.0.0 First release prepared for CRAN. Breaking changes - Only run_mvp(), mvp_app() and the %>% re-export are exported; the helper functions, model templates and UI settings are now internal. They remain available by name inside the app, the in-app code editors and pw_models_path scripts. - The inactive use_bi_styling argument of run_mvp() was removed, together with the old logo files and color names. - nonmem2mrgsolve is declared in Suggests via the stevechoy.r-universe.dev repository; httr2, curl and mime (only needed for AI translation) moved from Imports to Suggests. - License is now declared as GPL (>= 3). - Plots and derived metrics (AUC, Cmax, percentiles, sensitivity and exposure tables) use observation records (EVID == 0) only, so a dose at a sampling time no longer shows as a second, post-dose point (e.g. at 72 h with 12 doses every 12 h). Cmax, AUC and similar metrics now only reflect sampled values. The downloadable simulated data and the reproducible bundle's solved_output still contain all records, with dose records kept only at sampled times, and the bundle's example plot shows observations only (#73). Improvements - run_mvp() now opens the app in your web browser by default (launch.browser = TRUE), also from RStudio, which otherwise shows it in the viewer pane; pass launch.browser = FALSE to turn this off - Optional company branding: run_mvp()/mvp_app() gain brand_color, brand_text_color, brand_logo, brand_favicon and page_title (all NULL by default, which keeps the standard look) to set the navbar/panel/table-header colour, a navbar logo, a favicon and the page title at launch, without editing package files (#76) - New default browser-tab icon (two concentration-time curves on the app's navy); brand_favicon still replaces it (#76) - The browser tab title is now "Model Visualization Platform (MVP)" instead of showing the raw
markup (#76) - Simplified launching (#31): new exported mvp_app() returns the app object for deployment (an app.R containing MVPapp::mvp_app()), replacing standalone_mode in inst/shiny/app.R, which downloaded code from GitHub at every start. Launching without installation via shiny::runGitHub() now loads MVPapp into the app's own environment instead of the global environment, checks dependencies against DESCRIPTION, and can be pinned to a release with ref. inst/shiny/packages.R was removed. - Global options used by the app (scipen, DT.options, shiny.maxRequestSize) are set when the app starts and restored when it stops. - run_mvp() no longer modifies the global environment or search path, and restores any global options it changes when the app closes. Extra arguments in ... now reach the app. - Objects previously written to the global environment for debugging (e.g. llm_result, llm_refine, last_ev_df) are now kept in MVPapp:::.mvp_state; see "Objects kept for debugging" in ?run_mvp. AI translation responses are only kept when show_debugging_msg = TRUE. - Helper functions are split from functions.R into topic files. - Fewer dependencies: 'forcats', 'gridExtra', 'purrr' and 'tibble' are no longer needed, and 'GGally' (used only for the correlation plot in Data Exploration) is now optional (Suggests) (#32). - Faster app: changing the y-axis or percentiles on the Variability page no longer re-runs the simulation, sorting individual plots is about 200 times faster, and tornado/spider and data plots no longer re-render while typing or changing options (#45) - Removed unused internal functions (#33). - Simpler internal code with the same results (#77): exposure metrics share one trapezoidal AUC, the plots share helpers for observed data, colours, log axes and regression lines, the tornado and spider plots share their axis logic, and the AI-translation requests share one request path. Dead code and unused arguments were removed. Regression lines are fitted once per group instead of three times, and additional doses (ADDL) are written out without a row-by-row loop. A 0 entered below a field's legal minimum is now replaced by the minimum. Bugfixes - NCA report failed with ncar >= 0.7.2, which no longer exports its PDF helpers (#26) - Static "Show Individual Profiles" plot joined all subjects into one line; each model's profiles now use that model's color (#27) - Model 2 variability simulation failed when a covariate database was selected (#28) - Reproducible bundle downloads used the dosing events of whichever model was simulated last (#29) - Launching via shiny::runGitHub() failed unless shiny was attached (#30) - The LLM API key is no longer printed to the console during AI translation (#34) - AI translation: NONMEM to rxode2 (nonmem2rx) works again and accepts supporting files (.ext, .phi, .cov, ...) alongside the control stream or listing file, uploads are checked against the selected provider's file types, and translated code containing backslashes or quotes is kept intact (#35) - Typing in the password box no longer resets the model selection or erases edited model code; Model 2 now starts on its intended default model (#36) - Session loading: a second load via the other "Load Session" button is no longer ignored, and all settings are restored correctly (#37) - NCA: the geometric mean is no longer biased low when values are NA or zero, and subject IDs containing quotes no longer break NCA (#38) - The '% CFB' value box read the Mean % CFB column (#39) - Variability: a clear message instead of duplicated subjects when too few database subjects match the filters, and clearing the Seed box no longer closes the session (#40) - Data Exploration: 'Flag Outliers' works with dosing rows present, text columns with NA no longer break plots, and ID/TIME are detected from PTNO/ATSD columns (#41) - Spider plots rank parameters by how much they change the metric (#42) - Saved sessions record the running MVPapp version (previously always 0.4.5), the locked-models help text links to this repository, and Data Exploration plots no longer print ggplot2 messages to the console (#46) - Exposure metrics over a time window (Parameter Sensitivity Analysis, tornado/spider plots and Variability exposure tables) took the next dose's peak when the window ended on an additional (ADDL) dose time. Additional doses are now simulated as separate records, so each dose time has its pre-dose and post-dose value; a window uses the pre-dose (trough) value at its end and the post-dose value at its start. Cavg is now AUC divided by the window length instead of the mean of the sampled values (#47) - Compiling Model 1 with an error after a model had compiled successfully closed the session (#48) - After loading a saved session, a dataset newly chosen with "Browse server files" was ignored in favour of the session's dataset (#49) - The "batch results are out of date" warning for tornado/spider plots now only shows while the matching "Model N (All Parameters)" tab is open, instead of appearing whenever parameters are edited on the Simulation page - Data Exploration plots with a log axis: the grey grid lines now sit at 1, 2, ... 9 times each power of 10, lining up with the log tick marks instead of at unrelated positions - The "For Internal Use Only" watermark is now a plot layer that does not depend on the axis scales, so it stays on static (non-interactive) plots with log axes, in facets and in downloads; the interactive plots keep their own watermark - "Generate All Individuals (.pdf)": a last page with fewer subjects than rows x columns (e.g. 3 subjects on a 3 x 3 page) now keeps the panel size of the other pages, with the unused space left white, instead of stretching the panels over the whole page - Individual plots with "Insert regression" showed every subject's equation in every panel instead of one per panel (#50) - AI translation with an OpenAI-Compatible provider now sends OPENAI_COMPATIBLE_API_KEY; previously ellmer fell back to OPENAI_API_KEY, which could send an OpenAI key to the other provider (#51) - Variability helpers no longer fail when a model has no $OMEGA or $SIGMA block (#52) - Data Input no longer closes the session when a file has columns that only differ by case or a #/@ prefix (e.g. dv and DV, #ID and ID): the first keeps its name and the others get a suffix (DV_1). De-selected columns that disappear after unticking a built-in option, and Data Editor code that doesn't return a data frame, are also handled (#53) - Variability: pulling covariate distributions from a dataset without an ID column, or without a previously selected column, no longer closes the session. Switching patient database no longer errors while the age range updates, and the NHANES age slider is limited to the ages in the database (2-85 years) (#54) - Variability: an edited OMEGA/SIGMA matrix is always checked for positive semi-definiteness (also with @correlation, with a small tolerance for valid rank-deficient blocks), and a matrix mrgsolve refuses no longer closes the session (#55) - Variability: a single simulated subject now gets variability and sampled covariates, the sex ratio is exact (e.g. 7 of 10 subjects male at 70%), covariates the model also outputs (e.g. $CAPTURE WT) are no longer duplicated as WT.x/WT.y, and changing Model 1's number of subjects no longer re-simulates Model 2 (#56) - Mean % change from baseline (MEANCFBPCT) is now time-weighted, like Cavg, instead of the mean of the sampled values (#57) - Median lines no longer fail when the x-axis has a single value (e.g. trough-only data); tornado plots no longer fail when no parameter changes the metric; regression lines work with column names such as Conc (ng/mL) (#58) - Duration/rate syntax (D_/R_) is detected when indented, e.g. under $MAIN (#59) - NCA table labels: AUCPEO is the observed (not predicted) % extrapolated AUC, AUCPEP and MRTinf,pred (MRTIVIFP) are now labelled, and AUCIFPD shows its per-dose unit (#60) - AI translation: a control stream that nonmem2mrgsolve can't parse no longer closes the session, and error messages show the provider's message for that request only (#61) - Removed the bslib "Navigation containers expect a collection of nav_panel()" warnings printed by every mvp_app() call (#62) - Data Exploration: nmdata() uses the built-in filtered data directly instead of an always-true !is.null(a | b) check, 'Download' of data and summaries no longer writes broken CSVs when a value contains a comma, the dosing column falls back to AMTNM correctly, individual plots ignore the unused median-line/smoother options and skip the regression label on log axes (where it was shown on the linear scale), the legend appears for medians by group, identical Model 1/Model 2 names in the exposure boxplot no longer merge into one box, and an empty sort selection no longer leaves a trailing comma in panel labels (#63) - UI: swapped popover trigger/placement, wrong popover IDs and a leftover debug popover fixed, passwords are masked, the Apply/Cancel dialog button is labelled "Close", dead code and typos removed, selected = used instead of partial matching, and the Model 2 tornado summary and covariate popovers use the right labels (#64) - Performance: the AutoComplete toggle registers one editor observer instead of one per click, the simulation plot container is no longer rebuilt (flicker, lost zoom) on every change, custom sampling times are parsed once, NCA subsetting splits the data once (2000 subjects: ~10 s to ~0.2 s), and axis breaks are derived from the data instead of ggplot_build() (#65) - AI translation: Reset updates the local-parse checkbox, an empty OpenAI-Compatible URL is rejected, the upload list accepts all nonmem2rx file types, a lone .ext is no longer sent as a binary file, Dify service names are shared, and the test compile is skipped for non-mrgsolve output (#66) - NCA/metrics: a cleared molecular weight no longer errors, PDF devices are opened before par() (no stray Rplots.pdf) and closed on error, a warning is shown when a time window has no sample at its bounds (values are not interpolated), na.rm is used in summaries, and a failed bound run is no longer ranked as the most sensitive parameter (#67) - Variability/Sensitivity/Sessions: upper age, weight and BMI bounds are inclusive (CDC 0-20 y keeps 240-month subjects), Model 2 uses the same maximum subject count as the UI, the eigenvalue check has a tolerance, both models share one exposure-window time list, fallback multipliers agree, dosing events are kept per session rather than shared across users, and saved sessions restore the parameter selector and tornado time window (#68) - Templates/documentation: the mrgsolve version in the code preambles reflects the installed version at load time, the QE-TMDD template no longer gives NaN for Lfrac and labels TVKD in nM, the unexported mrgsolve:::code() is no longer used, and several help pages were corrected (#69) - The DESCRIPTION URL field no longer lists the DOI link (the DOI is cited in Description), launching no longer calls installed.packages(), and the app restores the R random-number state (.Random.seed) when it stops, like the global options (#70) - Simulated output, plots and time-window choices are limited to the sampled range again: dosing records after the maximum sampling time (e.g. 12 doses every 12 h with a 72 h maximum) extended plots, and dosing times were offered as window start/end times (#71) - Creating a tornado plot no longer prints "Ignoring unknown aesthetics: text" to the console (#72) - Variability: percentiles, prediction intervals and "% above threshold" use observation records only, so they no longer blend pre- and post-dose values at dose times that are also sampling times (#73) - Time windows: the Start/End pickers of the NCA and tornado pages offer sampled times only after a change, too (#74) - Multi-user: compiled model names are unique per session and rewritten when a session file is loaded, so two sessions (or tabs) no longer delete each other's compiled model (#74) - Sessions now also save and restore typed $PARAM values, applied OMEGA/SIGMA matrices, solver settings, CFB_from_DV, dataset-covariate options and custom covariate parameters (#74) - Model passwords are also checked on the server; % CFB, Mean % CFB and Nadir % CFB show "N/A" instead of Inf for a zero baseline; nonmem2mrgsolve output is escaped like AI output (#74). ?run_mvp documents that authentication_code, model passwords and AI translation are not a security boundary - Smaller fixes: faceting by a non-syntactic column name, a warning when tornado/spider results are out of date, parameter inputs namespaced (param_m1_/param_m2_), repeated notifications replace each other, NCA dose from the first dosing record, temporary upload folders removed, iterate_batch_runs() runs outside Shiny, zero reference values handled in sensitivity plots, single weight/BMI matched within a tolerance, and ID/USUBJID reserved as covariate names (#75) Documentation - Help pages for the cdc.expand, nhanes.filtered and who.expand datasets describe each column (with units and SEX coding), how the data were derived, and their sources; ?run_mvp defaults and arguments are up to date (#46) - Scripts supplied via pw_models_path that were copied from the template before 1.0.0 should update the end of update_model_choices(); see vignette("supply-passwords") (#36) Changes in version 0.4.7 (2026-10-03) Features - Maximum upload dataset size (in MB) can now be set by the max_dataset_size argument, with a default value of 200 (#25) Bugfixes - Correcting some tooltips not being displayed properly (#24) Changes in version 0.4.6 (2026-10-01) Features - Supports server-side dataset upload to be compatible in a validated environment (#22) - QoL additions to the standalone .zip bundle (#23) Bugfixes - Correcting a behavior where doses with infusion rates would fail to display properly in individual plots (#21) Changes in version 0.4.5 (2026-09-26) Features - Overhauled the Download Model button to have all relevant information in a standalone .zip bundle, together with a built-in R script to allow full reproducibility (#19) Documentation - AI Translation feature had its performance evaluated and documented in its vignette with results available on GitHub (#20) Changes in version 0.4.4 (2026-09-19) Features - Automatic Change From Baseline (CFB) derivations for uploaded datasets using the DV column, per ID and CMT (using the first instance of EVID == 0, if present) (#18) - Separating the original character-type ID column into USUBJID and a numeric ID column for simulation outputs to make it more NONMEM friendly (#16) Bugfixes - Dosing information now correctly included in all simulation outputs such that outputs are NONMEM-ready (#15, #17) QoL Changes - Extra download button for demographics for easier-access directly on the Demographics tab in Variability page (#14) - Updated the model code for the "2 Compartment PK/PD (Indirect Effect)" model to be more general - Updated default LLM model names Changes in version 0.4.3 (2026-08-13) Features - Supporting the use of covariate distributions (or EBEs) from uploaded datasets in variability simulations (#13) Bugfixes - Fixing an issue where summary statistics with a non-numeric ID column are collapsed into the same subject (#12) Changes in version 0.4.2 (2026-08-03) Bugfixes - Fixed an issue where LLM model translation fails for thinking models (#11) Changes in version 0.4.1 (2026-03-15) Features - Deterministic translation from NONMEM files using nonmem2mrgsolve and nonmem2rx (#10) Changes in version 0.4.0 (2026-03-02) Features - Automatic model translation using LLMs (#4) - Supports Saving / Loading sessions (#5) Bugfixes - Minor bugfixes and general performance improvements. (#3) - Plotly compatibility check with ggplot2 >=4.0.0 (#6) Changes in version 0.3.5 (2026-02-04) Bugfixes - Dosing info now displays correctly for all doses in Individual Plots (#2) Changes in version 0.3.4 (2025-12-02) Features - Covariate histograms feature in Data Exploration (#1). Changes in version 0.3.3 (2025-07-31) Features - NHANES database updated to include 2021-2023, which brings it to approx. 100k real subjects available for sampling (#1) - BMI filtering support for external databases - Supports running app directly without installation (moved a few uncommon dependencies to suggests instead) Bugfixes - Correct typos for tooltips - Corrected CV% for summary statistics to always report as absolute values - Applying the distinct by ID built-in filter last for uploaded datasets (#47) - Corrected behavior of range filters for filtered data display when a scroll bar is used (#48) Changes in version 0.3.2 (2025-06-13) Features - Spider plot functionality added for batch runs (#46) Changes in version 0.3.1 (2025-06-12) Bugfixes - Weight-based dosing now correctly apply for batch runs and variability simulations (#6) Changes in version 0.3.0 (2025-06-09) Features - Implemented Batch runs (Parameter Sensitivity Analysis Page - All Parameters) to assess all parameters in the model with a defined upper/lower range in a single click (#44) - QoL features includes fixing parameters, reset entire table, multiple display scales, and other graphical options Bugfixes - General performance improvements for larger models with long sampling (#43) - Stability and minor UI fixes Changes in version 0.2.19 (2025-06-03) Features - Re-worked median line bins to be based on quantiles (#37, #38) - Built-in data filtering option to distinct by ID (#40) - More QoL options for NCA (safeguards and rounding) (#41) - Minor re-factoring and other QoL updates Bugfixes - Prevent non-sensible parameter estimates from crashing the entire app (#42) - Bug fixes for General Plot's box plot count labels (#39) - Better handling of NAs for Quantize X-axis option in General Plot Changes in version 0.2.18 (2025-04-21) Features - New option for individual plots to identify outliers (#36) - New option for individual plots to sort by one or more variables (#35) - Additional tooltips for several options - Separate plot titles for general and individual plots - New template model (Parallel zero/first-order absorption model) Bugfixes - Fixed a bug where NCA would fail if dosing rows are not excluded by default (#33) - Safeguard for simulating too many samples, with a default value of max 20000 samples (#32) - NCA is now sorted by the grouping variable, followed by the dose column (#34) Changes in version 0.2.17 (2025-03-13) Features - New option to split X-axis into quantiles for Data Page General Plots (#30) - More template models (QS TMDD, MM TMDD). Bugfixes - Allows age and/or weight range sliders in Variability page to be the same value (#29) - Re-worded some tooltips to improve clarity. Changes in version 0.2.16 (2025-03-04) Features - Implement a short delay for some inputs to avoid frequent computations (#28) Bugfixes - Corrected code for Michaelis-Menten example (#27) Changes in version 0.2.15 (2025-02-26) Features - Filter per column in Data Page (#26) Bugfixes - Handle duplicated column names in an uploaded dataset (#23) - Properly display log y-axis with same scale when dosing info is displayed for Individual Plots (#25) Other - The built-in filter for removing EVID rows now uses EVID >= 1, instead of EVID == 1 | EVID == 4 Changes in version 0.2.14 (2025-02-07) Features - Additional tab for Variability plots to display box plots of exposures (#22) Bugfixes - Minor updates to some tooltips and button placements to increase clarity. Changes in version 0.2.13 (2025-02-04) Features - Dosing information, scaling, and LLOQ plotting options for Individual Plots (#18, #21) - More options for dataset built-in cleaning (#20) Bugfixes - Checking for column validity for "Color by" option in General Plots (#19) Changes in version 0.2.12 (2025-01-06) Features - Multiple facets for General Plots (#17) - Individual plots for exploring uploaded datasets (#15) - Mean trend toggle for variability plots (#13) - Progress bars for longer computations where a spinner graphic is not feasible (#16) Bugfixes - Allow "Total Doses" for each Dosing Regimen to be 0 (#14) Changes in version 0.2.11 (2024-12-04) Features - Support for uploading tab-delimited .txt files on Data Upload, with the option to automatically create ID column. (#9) - Uses dose column instead of manually entering dose amount for NCA. - Download Options now support non-interactive plots, with a dedicated "Download Non-Interactive Plot" button. (#11) Bugfixes - NCA Clearance unit corrected to be based on the supplied time unit. - Linear regression is center aligned for ggplots (#10) Changes in version 0.2.10 (2024-11-28) Features - Less strict requirements for Data Exploration plots to only require "ID" column to be present (previously would require "ID", "DV", and "TIME"). - Interactive plot toggle for Simulation and Data page plots. - Boxplot functionality for Data Exploration - Plot Output. (#7) - Text size option for labels (affects linear regression formulae and boxplot counts (N=x) only). Bugfixes - Fixed some typos. - Most selectizeInputs now sort alphabetically. Other - Suggests mrgsolve v.1.5.2 to be installed. Changes in version 0.2.9 (2024-10-25) Features - Upgraded Data Input - Plot Output tab, supporting facets, smoothers, and linear regression. (#5) Bugfixes - Fixed display error when model does not compile for PSA plots. (#2) - Fixed wrong behavior for median lines binning. (#4) - Consistently include dates for all downloadable items. Changes in version 0.2.8 (2024-10-14) Features - More template models (1 CMT lag time). - Increasing default decimal places (3 -> 5) for variability quantiles. - Supports $PRED syntax. When model has $PRED syntax, dosing amounts will be disabled. - Using recover = TRUE by default to output more helpful error messages when mrgsolve does not compile. Bugfixes - Bugfix for WT-based dosing to propagate correctly to Parameter Sensitivity Analysis when WT is a parameter (Note: currently WT-based dosing remains unsupported in Variability simulations). Changes in version 0.2.7 (2024-09-30) - GitHub release - Minor bugfixes and optimizations