<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>pharmaverse blog</title>
<link>https://pharmaverse.github.io/blog/</link>
<atom:link href="https://pharmaverse.github.io/blog/index.xml" rel="self" type="application/rss+xml"/>
<description>Short, fun and user-driven content around the pharmaverse.</description>
<generator>quarto-1.9.12</generator>
<lastBuildDate>Thu, 30 Apr 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Closing the Gap in Exposure-Response Data: A Pharmaverse Framework</title>
  <dc:creator>Jeff Dickinson</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-04-17-closing-the-gap-in/closing-the-gap-in-exposure-response-data-a-pharmaverse-framework.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="the-missing-standard" class="level2">
<h2 class="anchored" data-anchor-id="the-missing-standard">The Missing Standard</h2>
<p>CDISC released the Population Pharmacokinetic (PopPK) Implementation Guide in 2023, giving the clinical programming community a clear structural blueprint for PK analysis datasets. But Exposure-Response (ER) modeling — which builds directly on PopPK outputs to characterize relationships between drug exposure, safety, and efficacy — has no equivalent standard.</p>
<p>The result is predictable: different studies, different variable names, different exposure metrics, different dataset structures. Every ER analysis team starts more or less from scratch. That makes cross-study pooling, automation, and programming more difficult than necessary, particularly with ever-quickening turnaround times in drug development.</p>
</section>
<section id="a-framework-built-on-what-we-already-have" class="level2">
<h2 class="anchored" data-anchor-id="a-framework-built-on-what-we-already-have">A Framework Built on What We Already Have</h2>
<p>ER datasets share a lot of structural DNA with PopPK datasets — numeric covariates, relative time variables, pharmacokinetic exposure metrics. That overlap is the starting point for this framework: extending CDISC ADaM principles already established for PopPK into the ER space.</p>
<p>Early discussions are underway with the CDISC ADaM working group about moving this framework forward as a Knowledge Article or Examples Document. The working group has expressed interest in positioning ER datasets as a subclass of ADPPK — grounding the framework within existing CDISC standards architecture and providing a clear lineage from the 2023 PopPK Implementation Guide. Nothing is formalized yet, but the direction is encouraging.</p>
<p>The result of the new framework is four specialized datasets, each targeting a different aspect of ER analysis:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Dataset</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong><code>ADER</code></strong></td>
<td>Exposure foundation — comprehensive PK metrics, transformations, and baseline covariates</td>
</tr>
<tr class="even">
<td><strong><code>ADEE</code></strong></td>
<td>Exposure-Efficacy — time-to-event efficacy outcomes linked to drug exposure</td>
</tr>
<tr class="odd">
<td><strong><code>ADES</code></strong></td>
<td>Exposure-Safety — adverse event occurrence, severity, and time-to-onset by exposure</td>
</tr>
<tr class="even">
<td><strong><code>ADTRR</code></strong></td>
<td>Exposure-Tumor Response Rate — categorical tumor response (CR, PR, SD, PD) by exposure</td>
</tr>
</tbody>
</table>
<p>Each dataset builds on standard ADaM datasets (<code>ADSL</code>, <code>ADRS</code>, <code>ADTTE</code>, <code>ADAE</code>, <code>ADLB</code>, <code>ADVS</code>) and incorporates PK parameters from <code>ADPC</code>/<code>ADPP</code>, producing analysis-ready datasets without additional data wrangling.</p>
<p>The framework was presented as paper DS12 at PHUSE US Connect 2026 in Austin, TX. The <a href="https://phuse.s3.eu-central-1.amazonaws.com/Archive/2026/Connect/US/Austin/PAP_DS12.pdf">paper</a> and <a href="https://phuse.s3.eu-central-1.amazonaws.com/Archive/2026/Connect/US/Austin/PRE_DS12.pdf">slides</a> are now available in the PHUSE archive.</p>
</section>
<section id="why-the-pharmaverse-ecosystem" class="level2">
<h2 class="anchored" data-anchor-id="why-the-pharmaverse-ecosystem">Why the Pharmaverse Ecosystem?</h2>
<p>The framework is implemented using <code>{admiral}</code>, <code>{metacore}</code>, <code>{metatools}</code>, and <code>{xportr}</code> — the same toolchain used across the pharmaverse for ADaM dataset development. That choice was intentional.</p>
<p><code>{admiral}</code>’s modular derivation functions map naturally onto how ER datasets are built incrementally. Its <code>assert_*</code> functions catch errors at the point of derivation rather than burying them downstream. <code>{metacore}</code> keeps specs and code in sync. <code>{metatools}</code> provides utility functions for metadata management and validation. <code>{xportr}</code> handles CDISC compliance at the point of export.</p>
<p>The pharmaverse ecosystem did not just make implementation easier — it made the framework more trustworthy and maintainable. And because it is open-source, every improvement feeds back to the community.</p>
</section>
<section id="the-examples-page" class="level2">
<h2 class="anchored" data-anchor-id="the-examples-page">The Examples Page</h2>
<p>The working R code is now live on the <a href="https://pharmaverse.github.io/examples/adam/ader.html">pharmaverse examples site</a>.</p>
<p>The <code>ADER+</code> page covers all four datasets in a single tabbed page, with:</p>
<ul>
<li>A shared introduction explaining the ER framework and its relationship to the PopPK Implementation Guide</li>
<li>Common derivations used across all four datasets</li>
<li>Dataset-specific derivation code for <code>ADER</code>, <code>ADEE</code>, <code>ADES</code>, and <code>ADTRR</code></li>
<li>Full variable listings and metadata</li>
</ul>
<p>The code uses <code>{pharmaverseadam}</code> as source data, making it immediately reproducible. Think of it as a template — a starting point you can adapt for your own studies.</p>
</section>
<section id="we-need-your-feedback" class="level2">
<h2 class="anchored" data-anchor-id="we-need-your-feedback">We Need Your Feedback</h2>
<p>This framework is a proposal, not a finished standard. Any formal ER ADaM standard would ultimately be owned and ratified by CDISC — the community can propose, pilot, and advocate, but the path to an official standard requires active collaboration with CDISC. The groundwork for that is community validation: pilot testing across therapeutic areas, working group discussion, and real-world use.</p>
<p>That means we need two kinds of input:</p>
<p><strong>Clinical programmers</strong> — try the code. Does the derivation logic hold up? What edge cases are we missing? Open an issue or PR on the <a href="https://github.com/pharmaverse/examples">pharmaverse examples repository</a>.</p>
<p><strong>ER modelers and pharmacometricians</strong> — this one is especially for you. Does this dataset structure actually serve your modeling needs? Are the exposure metrics the right ones? Is the dataset grain appropriate for the analyses you run? You are the end users of these datasets, and your perspective is exactly what’s needed to make this framework scientifically sound, not just technically compliant.</p>
<p>The discussion is open. Let’s keep it going.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:35:46.92611</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-04-17-closing-the-gap-in/closing-the-gap-in-exposure-response-data-a-pharmaverse-framework.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{dickinson2026,
  author = {Dickinson, Jeff},
  title = {Closing the {Gap} in {Exposure-Response} {Data:} {A}
    {Pharmaverse} {Framework}},
  date = {2026-04-30},
  url = {https://pharmaverse.github.io/blog/posts/2026-04-17-closing-the-gap-in/closing-the-gap-in-exposure-response-data-a-pharmaverse-framework.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-dickinson2026" class="csl-entry quarto-appendix-citeas">
Dickinson, Jeff. 2026. <span>“Closing the Gap in Exposure-Response Data:
A Pharmaverse Framework.”</span> April 30, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-04-17-closing-the-gap-in/closing-the-gap-in-exposure-response-data-a-pharmaverse-framework.html">https://pharmaverse.github.io/blog/posts/2026-04-17-closing-the-gap-in/closing-the-gap-in-exposure-response-data-a-pharmaverse-framework.html</a>.
</div></div></section></div> ]]></description>
  <category>ADaM</category>
  <category>Community</category>
  <category>Technical</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-04-17-closing-the-gap-in/closing-the-gap-in-exposure-response-data-a-pharmaverse-framework.html</guid>
  <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-04-17-closing-the-gap-in/pharmaverse_examples.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>AGENTS.md, {admiral}, and the AI-Assisted Programmer</title>
  <dc:creator>Jeff Dickinson</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-03-31-agents-md-admiral-a/agents-md-admiral-and-the-ai-assisted-programmer.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>AI coding assistants are becoming a natural part of how clinical R programmers work — autocompleting functions, suggesting test cases, drafting derivations. But out of the box, these agents know nothing about ADaM conventions, CDISC standards, or how the pharmaverse ecosystem fits together. They don’t know that analysis flag variables such as <code>ANL01FL</code> typically take <code>"Y"</code> or <code>NA</code> and not <code>"N"</code> They don’t know that <code>{pharmaversesdtm}</code> is the canonical source of test SDTM data, or that <code>{xportr}</code> is waiting downstream to turn your dataset into a submission-ready XPT file. <code>AGENTS.md</code> is a simple, open standard that changes that — and the <code>{admiral}</code> ecosystem now has infrastructure to generate and maintain these files automatically across every package in the family.</p>
</section>
<section id="what-is-agents.md" class="level2">
<h2 class="anchored" data-anchor-id="what-is-agents.md">What Is AGENTS.md?</h2>
<p><code>AGENTS.md</code> is a plain markdown file you commit to your repository that gives AI coding agents the context they need to work correctly in your project. Think of it as a README for agents — while <code>README.md</code> tells a new developer what the project is, <code>AGENTS.md</code> tells an AI assistant how to work in it correctly.</p>
<p>The format is supported across the growing ecosystem of AI coding tools: OpenAI Codex, GitHub Copilot, Google’s Jules, Cursor, Aider, Gemini CLI, and more. One file, version-controlled alongside your code, works everywhere.</p>
</section>
<section id="why-this-matters-for-the-pharmaverse" class="level2">
<h2 class="anchored" data-anchor-id="why-this-matters-for-the-pharmaverse">Why This Matters for the pharmaverse</h2>
<p>ADaM derivations encode decades of CDISC regulatory expectations that don’t appear anywhere in the R syntax. The fact that <code>ANL01FL</code> is an analysis flag with specific derivation logic, that <code>DTYPE = "LLOQ"</code> imputation records follow specific rules — none of this is inferable from the code alone.</p>
<p>The <code>{admiral}</code> package also doesn’t exist in isolation. It operates in a pipeline that flows from <code>{pharmaversesdtm}</code> test data through admiral derivations, often guided by <code>{metacore}</code> specifications, and ultimately out through <code>{xportr}</code> to submission-ready XPT files. An agent writing admiral code without that context is like a new programmer who only knows the function they’re editing — not the system it belongs to.</p>
<p>An <code>AGENTS.md</code> in an admiral-family repository can communicate all of this before the agent writes a single line of code.</p>
</section>
<section id="a-first-step-in-the-pharmaverse-ai-strategy" class="level2">
<h2 class="anchored" data-anchor-id="a-first-step-in-the-pharmaverse-ai-strategy">A First Step in the pharmaverse AI Strategy</h2>
<p>The <code>{admiral}</code> team is actively discussing how to formalize its approach to AI-assisted development — what tools to encourage, what guardrails to put in place, and how to document AI’s role in the programming strategy. That conversation is still early, and deliberately so: the consensus is to gain real experience before locking in formal guidance.</p>
<p>The good news is that experience is already arriving, fast.</p>
<p><strong>March 7, 2026 — the question arrives.</strong> <a href="https://github.com/pharmaverse/admiral/pull/2996">PR #2996</a> landed from a new contributor, <code>maxthecat2024</code>, fixing poorly formatted warning messages in <code>derive_param_computed()</code>. The PR was thorough and well-structured — detailed before/after examples, snapshot test conversions, a fully completed checklist. It was also the kind of contribution that made the team wonder: was this an AI bot? We don’t know for certain, and ultimately it didn’t matter — the code was good and it got merged. But the question itself was telling.</p>
<p><strong>March 17, 2026 — the reality arrives.</strong> <a href="https://github.com/pharmaverse/admiral/pull/3010">PR #3010</a> was opened not by a human contributor, but by GitHub Copilot itself — the branch named <code>copilot/enhance-examples-derive-vars-merged-summary</code>, the author listed as <code>Copilot</code>. The PR enhanced documentation examples for <code>derive_vars_merged_summary()</code>, correctly picking up the admiral-specific <code>@examplesx</code> structured example pattern from the existing codebase — context that came directly from <code>AGENTS.md</code>.</p>
<p>But the PR also revealed an important limitation. Rather than running <code>devtools::document()</code> to regenerate the <code>.Rd</code> file, Copilot manually edited <code>man/derive_vars_merged_summary.Rd</code> directly — and its own PR description acknowledged this: <em>“Manually updated to match <code>roxygen2::roxygenize()</code> output.”</em> When a reviewer pointed this out, Copilot responded candidly: <em>“R is not available in my sandbox environment, so I can’t execute <code>devtools::document()</code> directly. For future sessions, I understand the correct workflow.”</em> A human reviewer ran <code>devtools::document()</code> outside the sandbox and pushed the correctly generated <code>.Rd</code> file in commit <code>c855860</code>.</p>
<p>This is an important nuance: the issue wasn’t that <code>AGENTS.md</code> was unclear — it was that Copilot’s execution environment simply didn’t have R available. No instruction, however well-written, can make an agent run a command it physically cannot execute. <code>AGENTS.md</code> can teach an agent the correct workflow; ensuring the environment supports that workflow is a separate, human-owned responsibility. That distinction matters as the community develops its AI strategy.</p>
<p>This two-week window tells the whole story. AI-assisted contributions are already arriving in the <code>{admiral}</code> repository. <code>AGENTS.md</code> is already helping agents understand project-specific conventions. And the gaps it exposes are already informing improvements. This is the feedback loop the community needs to build a thoughtful AI strategy — not speculation, but evidence.</p>
<p><code>AGENTS.md</code> represents the first tangible infrastructure to come out of that thinking. Whether a contributor is a human using an AI assistant, an autonomous agent, or something in between — the code still needs to follow ADaM conventions and pharmaverse standards. <code>AGENTS.md</code> helps ensure it does.</p>
<p>If you have thoughts on what the broader strategy should look like, the discussion is open — join the conversation at <a href="https://github.com/pharmaverse/admiraldev/issues/547">admiraldev issue #547</a>. The broader scientific open-source community is working through similar questions: rOpenSci recently published an <a href="https://ropensci.org/blog/2026/02/26/ropensci-ai-policy/">AI policy</a> that’s worth reading as a reference point for how these norms are taking shape. Notably, rOpenSci’s policy calls out <code>agents.md</code> directly in its software review submission template:</p>
<blockquote class="blockquote">
<p>“If your repository includes an ‘agents.md’ file or equivalent, please provide a link, and describe how this has been used in the development of your package.”</p>
</blockquote>
<p>That the broader open-source scientific community is already asking for <code>AGENTS.md</code> as part of peer review is a signal that this norm is catching on fast.</p>
</section>
<section id="the-admiral-ecosystem-implementation" class="level2">
<h2 class="anchored" data-anchor-id="the-admiral-ecosystem-implementation">The Admiral Ecosystem Implementation</h2>
<p>Rather than each package maintaining its own file by hand, the generation logic is centralized in <code>{admiralci}</code> and delivers a consistent, up-to-date file to every package that opts in. The workflow pulls together content from several sources:</p>
<ul>
<li><strong>Programming strategy and unit testing guidelines</strong> from <code>{admiraldev}</code></li>
<li><strong>Package-specific context</strong> from a YAML file in each repository (therapeutic area, related packages, relevant CDISC IGs)</li>
<li><strong>Ecosystem context</strong> describing how admiral-family packages fit into the broader pharmaverse pipeline</li>
<li><strong>ADaM fundamentals</strong> covering key variable conventions and controlled terminology patterns</li>
</ul>
<p>The <code>{admiral}</code> <code>AGENTS.md</code> is substantial — over 1,300 lines of auto-generated context pulled directly from the <code>{admiraldev}</code> programming strategy, git usage, and R CMD check vignettes. It even includes a built-in verification mechanism: agents are instructed to add the comment <code># admiral guidelines loaded</code> to the first line of every new R file they create, confirming the guidelines were actually read. It’s a small but clever way to make agent compliance observable during code review.</p>
<p>Here’s a simplified illustration of the kind of content the file contains:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode markdown code-with-copy"><code class="sourceCode markdown"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;"># AGENTS.md — admiral</span></span>
<span id="cb1-2"></span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## Package Overview</span></span>
<span id="cb1-4">{admiral} provides a toolbox for ADaM dataset construction in R,</span>
<span id="cb1-5">following CDISC ADaM standards and pharmaverse conventions.</span>
<span id="cb1-6"></span>
<span id="cb1-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## ADaM Conventions</span></span>
<span id="cb1-8"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Flag variables (ANL01FL, SAFFL, etc.) take values "Y" or NA</span>
<span id="cb1-9"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>PARAM/PARAMCD pairs must align with CDISC controlled terminology</span>
<span id="cb1-10"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>ASEQ must be derived as the last step before dataset finalization</span>
<span id="cb1-11"></span>
<span id="cb1-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## Ecosystem Context</span></span>
<span id="cb1-13"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Test SDTM data: use {pharmaversesdtm} (CDISC pilot data)</span>
<span id="cb1-14"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Downstream: datasets consumed by {xportr} for XPT transport files</span>
<span id="cb1-15"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Metadata: {metacore}/{metatools} provide spec-driven variable control</span>
<span id="cb1-16"></span>
<span id="cb1-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## Unit Testing</span></span>
<span id="cb1-18"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Use {testthat} with expect_dfs_equal() for dataset comparisons</span>
<span id="cb1-19"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Every new function requires tests for typical use, edge cases, and errors</span>
<span id="cb1-20"></span>
<span id="cb1-21"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## Documentation</span></span>
<span id="cb1-22"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Run devtools::document() to regenerate .Rd files — never edit man/ directly</span>
<span id="cb1-23"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Update NEWS.md for any user-facing function changes</span></code></pre></div></div>
<p>One practical note: <code>AGENTS.md</code> at the repository root triggers a NOTE in R CMD check, so the file is added to <code>.Rbuildignore</code>. It also lives in <code>tests/testthat/</code> where testing-specific guidance is scoped closest to where it’s needed. Extension packages like <code>{admiralonco}</code>, <code>{admiralvaccine}</code>, and <code>{admiralpeds}</code> can layer their own context on top, adding therapeutic area-specific conventions without duplicating shared infrastructure content.</p>
</section>
<section id="how-to-adopt-this-in-your-package" class="level2">
<h2 class="anchored" data-anchor-id="how-to-adopt-this-in-your-package">How to Adopt This in Your Package</h2>
<p>If you maintain an admiral-family package, adoption is three steps:</p>
<ol type="1">
<li>Add a YAML configuration file to your repository with package-specific context (therapeutic area, related packages, relevant CDISC IGs)</li>
<li>Reference the reusable workflow from <code>{admiralci}</code> in your <code>.github/workflows/</code> directory</li>
<li>Add <code>^AGENTS\.md$</code> to your <code>.Rbuildignore</code></li>
</ol>
<p>The workflow then runs on a schedule, pulling the latest content from <code>{admiraldev}</code> and your package YAML and committing an updated <code>AGENTS.md</code> automatically.</p>
</section>
<section id="resources" class="level2">
<h2 class="anchored" data-anchor-id="resources">Resources</h2>
<ul>
<li><code>AGENTS.md</code> standard: <a href="https://agents.md" class="uri">https://agents.md</a></li>
<li><code>{admiral}</code> <code>AGENTS.md</code> (live): <a href="https://github.com/pharmaverse/admiral/blob/main/AGENTS.md" class="uri">https://github.com/pharmaverse/admiral/blob/main/AGENTS.md</a></li>
<li><code>{admiral}</code> <code>sync-admiralci-agents</code> workflow (live): <a href="https://github.com/pharmaverse/admiral/blob/main/.github/workflows/sync-admiralci-agents.yml" class="uri">https://github.com/pharmaverse/admiral/blob/main/.github/workflows/sync-admiralci-agents.yml</a></li>
<li>pharmaverse AI strategy discussion: <a href="https://github.com/pharmaverse/admiraldev/issues/547" class="uri">https://github.com/pharmaverse/admiraldev/issues/547</a></li>
<li>pharmaverse examples site: <a href="https://pharmaverse.github.io/examples/" class="uri">https://pharmaverse.github.io/examples/</a></li>
<li>rOpenSci AI policy: <a href="https://ropensci.org/blog/2026/02/26/ropensci-ai-policy/" class="uri">https://ropensci.org/blog/2026/02/26/ropensci-ai-policy/</a></li>
</ul>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:16.375189</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-03-31-agents-md-admiral-a/agents-md-admiral-and-the-ai-assisted-programmer.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{dickinson2026,
  author = {Dickinson, Jeff},
  title = {AGENTS.md, \{Admiral\}, and the {AI-Assisted} {Programmer}},
  date = {2026-03-31},
  url = {https://pharmaverse.github.io/blog/posts/2026-03-31-agents-md-admiral-a/agents-md-admiral-and-the-ai-assisted-programmer.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-dickinson2026" class="csl-entry quarto-appendix-citeas">
Dickinson, Jeff. 2026. <span>“AGENTS.md, {Admiral}, and the AI-Assisted
Programmer.”</span> March 31, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-03-31-agents-md-admiral-a/agents-md-admiral-and-the-ai-assisted-programmer.html">https://pharmaverse.github.io/blog/posts/2026-03-31-agents-md-admiral-a/agents-md-admiral-and-the-ai-assisted-programmer.html</a>.
</div></div></section></div> ]]></description>
  <category>Technical</category>
  <category>ADaM</category>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-03-31-agents-md-admiral-a/agents-md-admiral-and-the-ai-assisted-programmer.html</guid>
  <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-03-31-agents-md-admiral-a/secret_agent.png" medium="image" type="image/png" height="167" width="144"/>
</item>
<item>
  <title>Meet dataviewR: The View() You Always Wanted</title>
  <dc:creator>Siddhesh Pujari</dc:creator>
  <dc:creator>Madhan Kumar N</dc:creator>
  <dc:creator>Gomathi S</dc:creator>
  <dc:creator>Mackenzie Haight</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/meet-dataviewr-the-view-you-always-wanted.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>Disclaimer: This blog contains opinions that are of the authors alone and do not necessarily reflect the strategy of their respective organizations.</p>
<section id="the-humble-view-and-its-limits" class="level2">
<h2 class="anchored" data-anchor-id="the-humble-view-and-its-limits">The humble <code>View()</code> and its limits</h2>
<p><code>View()</code> has served R programmers well for a long time — pass it a data frame, get a spreadsheet-style window. It even has a basic search bar for checking whether a value exists in your data. But the moment you need something more precise — filter by a specific column or combine conditions — you are back in your script.</p>
<p>Add to that: no side-by-side dataset comparison, no metadata inspection, and no way to carry your exploration into reproducible code. For day-to-day clinical data work — reviewing your clinical datasets, let’s say <code>ADSL</code>, cross-checking subject demographics against lab data in <code>ADLB</code>, doing a QC pass before analysis — these gaps add up.</p>
</section>
<section id="what-is-dataviewr" class="level2">
<h2 class="anchored" data-anchor-id="what-is-dataviewr">What is dataviewR?</h2>
<p><a href="https://madhankumarnagaraji.github.io/dataviewR/"><code>dataviewR</code></a> is a Shiny-based interactive data viewer that works alongside <code>View()</code> as a companion — not a replacement. It launches directly in your RStudio Viewer pane, requires no Shiny code, and never modifies the datasets passed to it.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataviewR"</span>)</span></code></pre></div></div>
</section>
<section id="features" class="level2">
<h2 class="anchored" data-anchor-id="features">Features</h2>
<p><code>dataviewR</code> offers the following capabilities:</p>
<ul>
<li><strong>Interactive Filtering</strong> — apply <code>dplyr</code>-style expressions directly in the app, no script changes needed. Supports <code>%in%</code>, <code>is.na()</code>, <code>grepl()</code>, and compound conditions — the same syntax you already write every day.</li>
</ul>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">SEX <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F"</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> AGE <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">65</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> TRT01P <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Xanomeline High Dose"</span></span></code></pre></div></div>
<ul>
<li><strong>Reproducible Code Generation</strong> — hit “Generate R Code” and walk away with ready-to-use <code>dplyr</code> code from your interactions. Your exploration session feeds directly into your scripted workflow.</li>
</ul>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/dataview_codegen.png" class="img-fluid figure-img" style="width:60.0%"></p>
<figcaption>Auto-generated dplyr code from interactive filter and column selections.</figcaption>
</figure>
</div>
<ul>
<li><strong>Variable Metadata</strong> — inspect variable classes, labels and attributes without writing <code>str()</code> or <code>attr()</code> calls. Particularly useful for clinical datasets where CDISC-style labels are carried as R attributes.</li>
</ul>
<p>See all of this in action:</p>
<video width="100%" controls="" playbackrate="2" onloadedmetadata="this.playbackRate = 2;">
<source src="dataview_explore.mp4" type="video/mp4">
</video>
</section>
<section id="cross-checking-multiple-datasets" class="level2">
<h2 class="anchored" data-anchor-id="cross-checking-multiple-datasets">Cross-Checking Multiple Datasets</h2>
<p>But what if you need to look at more than one dataset at the same time? <code>dataviewR</code> handles that too — pass multiple datasets in a single call and each opens in its own tab within the same session. Switch between them, filter independently, and track a specific subject across datasets — the kind of check that comes up in every safety review.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dataviewR)</span>
<span id="cb3-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(pharmaverseadam)</span>
<span id="cb3-3"></span>
<span id="cb3-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dataviewer</span>(adsl, adlb)</span></code></pre></div></div>
<video width="100%" controls="" onloadedmetadata="this.playbackRate = 1.5;">
<source src="dataview_multidata.mp4" type="video/mp4">
</video>
</section>
<section id="final-thoughts" class="level2">
<h2 class="anchored" data-anchor-id="final-thoughts">Final Thoughts</h2>
<p>That is dataviewR in a nutshell. Try it out and share your thoughts on <a href="https://github.com/madhankumarnagaraji/dataviewR">GitHub</a> or <a href="https://pharmaverse.slack.com">pharmaverse Slack</a>!</p>
<p>Full documentation, vignettes, and clinical dataset examples are available at <a href="https://madhankumarnagaraji.github.io/dataviewR/">madhankumarnagaraji.github.io/dataviewR</a>.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:43.834228</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-03-29-meet-dataviewr-the/meet-dataviewr-the-view-you-always-wanted.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{pujari2026,
  author = {Pujari, Siddhesh and Kumar N, Madhan and S, Gomathi and
    Haight, Mackenzie},
  title = {Meet {dataviewR:} {The} {View()} {You} {Always} {Wanted}},
  date = {2026-03-31},
  url = {https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/meet-dataviewr-the-view-you-always-wanted.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-pujari2026" class="csl-entry quarto-appendix-citeas">
Pujari, Siddhesh, Madhan Kumar N, Gomathi S, and Mackenzie Haight. 2026.
<span>“Meet dataviewR: The View() You Always Wanted.”</span> March 31,
2026. <a href="https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/meet-dataviewr-the-view-you-always-wanted.html">https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/meet-dataviewr-the-view-you-always-wanted.html</a>.
</div></div></section></div> ]]></description>
  <category>SDTM</category>
  <category>ADaM</category>
  <category>Shiny</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/meet-dataviewr-the-view-you-always-wanted.html</guid>
  <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-03-29-meet-dataviewr-the/dataviewR-logo.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>Beyond Keywords: How Semantic Search is Unlocking Clinical Code Reuse</title>
  <dc:creator>Mathieu Cayssol</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/beyond__keywords.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p><strong>Disclaimer:</strong> This blog contains opinions that are of the authors alone and do not necessarily reflect the strategy of their respective organizations.</p>
<section id="why-this-matters-for-pharmaverse-programmers" class="level2">
<h2 class="anchored" data-anchor-id="why-this-matters-for-pharmaverse-programmers">Why this matters for pharmaverse programmers</h2>
<p>Clinical reporting is built on repeatable patterns for ADaM derivations, TLGs, and QC, but finding these patterns is a significant challenge. Relevant code is often scattered, and traditional keyword searches fail for non-standard logic because the underlying variable names and structural conventions differ from study to study. CSA directly addresses this root cause by using semantic retrieval to find code based on its conceptual intent, not just matching keywords (e.g: plain English query such as “derive ABLFL in ADLB using a pre-dose baseline rule and analysis-visit windows”). This means programmers can reliably discover, review, and reuse relevant patterns from across all repositories, saving substantial time and ensuring greater consistency in their work.</p>
</section>
<section id="what-we-built" class="level2">
<h2 class="anchored" data-anchor-id="what-we-built">What we built?</h2>
<p>CSA is a focused agent inside our Clinical Analysis Assistant. A user asks a question; we create an embedding of that query, apply optional metadata filters, search the vector database, and return the most relevant code chunks alongside their origins. CSA supports both SAS and R programs.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/csa_agent.png" class="img-fluid figure-img"></p>
<figcaption>Code Search Agent - High level overview</figcaption>
</figure>
</div>
<p>Behind the scenes, we index code from our repositories, split it into coherent chunks, and generate short summaries that describe what each piece of code does. We then convert these summaries into numerical representations called embeddings (or vectors), which capture their semantic meaning. This allows the system to find code based on the idea of what it does, not just keyword matching. We store these vectors in a specialized database (vector database) and retain rich metadata such as programming language, file name, repository, and study description. The interface displays both the results and the parameters used so retrieval stays transparent and audit-friendly.</p>
<p>Here is an example of chunk and its metadata stored in the vector database.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 43%">
<col style="width: 56%">
</colgroup>
<thead>
<tr class="header">
<th>Field</th>
<th>Content</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Metadata: Program Name</strong></td>
<td>t_vs_orth.R</td>
</tr>
<tr class="even">
<td><strong>Metadata: TLG Title</strong></td>
<td>Summary of Orthostatic Change</td>
</tr>
<tr class="odd">
<td><strong>Metadata: TLG Footnote</strong></td>
<td>Result (Orthostatic Change) = Standing Vital Sign - Supine Vital Sign | The All Placebo column includes participants administered placebo from all cohorts.</td>
</tr>
<tr class="even">
<td><strong>Code (truncated)</strong></td>
<td><code>library(magrittr)</code><br><code>library(citril)</code><br><code>library(chevron)</code><br>…<br><code>adam_db &lt;- read_adam(parquet = arrow::read_parquet, select = c("adsl", "advs"))</code><br>…<br><code>adam_db[[dataset]] &lt;- adam_db[[dataset]] %&gt;%</code><br><code>filter(.data$ANL01FL == "Y" &amp; .data$AVISIT != "UNSCHEDULED" &amp; .data$DTYPE == "AVERAGE"...)</code><br><code>mutate(AVISIT = str_replace(.data$AVISIT, "BASELINE", "Baseline"), ...)</code><br>…<br><code>final_tlg &lt;- citril::decorate_tlg(tlg_output, ...)</code><br><code>export_tlg(final_tlg, file = output)</code></td>
</tr>
<tr class="odd">
<td><strong>Semantic Summary</strong></td>
<td>The R script <code>t_vs_orth.R</code> analyzes orthostatic changes in vital signs by calculating the difference between standing and supine measurements. It uses <code>adam_db$adsl</code> and <code>adam_db$advs</code> datasets, filters for relevant records (<code>ANL01FL == "Y"</code>, <code>AVISIT != "UNSCHEDULED"</code>, <code>DTYPE == "AVERAGE"</code>), calculates the CHG variable (change from baseline), standardizes visit labels, and creates a pooled “All” treatment category… The output table is exported in multiple formats with decorated titles and footnotes.</td>
</tr>
<tr class="even">
<td><strong>Embeddings (sample)</strong></td>
<td><code>[0.023, -0.145, 0.089, 0.234, -0.067, 0.178, -0.023, 0.145, 0.312, -0.089, 0.156, -0.234, 0.067, 0.298, -0.178, 0.045, ...]</code><br><em>(768-dimensional vector - truncated for display)</em></td>
</tr>
</tbody>
</table>
<section id="image-of-the-vectordb-and-vectors." class="level4">
<h4 class="anchored" data-anchor-id="image-of-the-vectordb-and-vectors.">Image of the VectorDB and vectors.</h4>
</section>
</section>
<section id="how-it-works" class="level2">
<h2 class="anchored" data-anchor-id="how-it-works">How it works</h2>
<section id="understand-the-ask" class="level3">
<h3 class="anchored" data-anchor-id="understand-the-ask">Understand the ask</h3>
<p>We transform user’s question into a semantic search query + metadata filters using the <a href="https://openai.github.io/openai-agents-python/">OpenAI agents software development kit</a>.</p>
</section>
<section id="retrieve-with-context" class="level3">
<h3 class="anchored" data-anchor-id="retrieve-with-context">Retrieve with context</h3>
<p>We perform a semantic search over the vector database and apply substring matching based on the metadata filters. Summaries help match intent (“derive <code>AVALC</code> from PARAMCD”) even if the snippet uses different variable names. The metadata filters help to narrow down the results to the most relevant snippets (e.g: adsl in the program name or phase III in the study description). Code on the ‘devel’ branch has generally been QC’d in our setup, which is a nice feature for code reuse.</p>
</section>
<section id="return-with-provenance" class="level3">
<h3 class="anchored" data-anchor-id="return-with-provenance">Return with provenance</h3>
<p>Results show snippet text, file path, repo, and any available study metadata. You can jump to source for review and reuse.</p>
<p><em>Design principle: retrieval should be fast, explainable, and reproducible. It should be possible to trace back the code to the original source.</em></p>
</section>
</section>
<section id="example" class="level2">
<h2 class="anchored" data-anchor-id="example">Example</h2>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/caa_csa.gif" class="img-fluid figure-img"></p>
<figcaption>Code Search Assistant</figcaption>
</figure>
</div>
</section>
<section id="what-programmers-can-do-today" class="level2">
<h2 class="anchored" data-anchor-id="what-programmers-can-do-today">What programmers can do today</h2>
<p>With CSA, programmers can look up ADaM and TLG scripts by intent, such as <em>“asking for an ADSL baseline flag with visit windowing”</em> or <em>“an <code>AVALC</code> mapping that treats missing values explicitly”</em>. They can locate TLG programs described in plain English. For instance, a table that splits columns by treatment arm and summarizes AVAL with mean and standard deviation and then adapt a proven layout. They can also compare similar implementations across repositories to converge on a standard approach while maintaining confidence through clear provenance back to source.</p>
</section>
<section id="metrics-and-usage" class="level2">
<h2 class="anchored" data-anchor-id="metrics-and-usage">Metrics and usage</h2>
<p>Over the observation window (15th of September 2025 - 19th of October 2025), the Code Search Assistant (CSA) handled 791 questions from 45 unique users, averaging 42 ± 14 weekly conversations and 92 ± 43 weekly questions. Satisfaction signals were positive: the broader Clinical Analysis Assistant (CAA) scored 3.39/5 for usefulness (n = 174), while the CSA specifically was rated at ~4/5, indicating strong early traction among active users.</p>
</section>
<section id="limitations-whats-next" class="level2">
<h2 class="anchored" data-anchor-id="limitations-whats-next">Limitations &amp; what’s next</h2>
<p>Today, CSA focuses on fast, trustworthy discovery. We are working on tighter IDE integration via MCP (Model Context Protocol - introduced by <a href="https://www.anthropic.com/news/model-context-protocol">Anthropic</a>) so you can search directly from your code editor (VSCode, RStudio, etc.). We also want to enable better study awareness so results are automatically filtered to the context of your study and clinical programming code. Finally, we are refining the data pipeline to continuously index changes without any manual effort and adding SDTM programs as well. These steps aim to make retrieval not only smarter but also more seamlessly woven into day-to-day programming.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:35:35.514131</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/beyond_key/beyond__keywords.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{cayssol2026,
  author = {Cayssol, Mathieu},
  title = {Beyond {Keywords:} {How} {Semantic} {Search} Is {Unlocking}
    {Clinical} {Code} {Reuse}},
  date = {2026-03-20},
  url = {https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/beyond__keywords.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-cayssol2026" class="csl-entry quarto-appendix-citeas">
Cayssol, Mathieu. 2026. <span>“Beyond Keywords: How Semantic Search Is
Unlocking Clinical Code Reuse.”</span> March 20, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/beyond__keywords.html">https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/beyond__keywords.html</a>.
</div></div></section></div> ]]></description>
  <category>Metadata</category>
  <category>ADaM</category>
  <category>TLG</category>
  <category>Community</category>
  <category>Conferences</category>
  <category>Technical</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/beyond__keywords.html</guid>
  <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-03-20_beyond_key_words/pharmaverse.png" medium="image" type="image/png" height="128" width="144"/>
</item>
<item>
  <title>pharmaverse Pillar: OSS and our 2026 Hackathon Calendar</title>
  <dc:creator>Orla Doyle and Ross Farrugia</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/pharmaverse-pillar-oss.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="os-software-solutions-pillar" class="level2">
<h2 class="anchored" data-anchor-id="os-software-solutions-pillar"><strong>OS Software Solutions Pillar</strong></h2>
<p>Firstly, if you’re reading this wondering what do we mean by a “pillar” then check our introductory blog <a href="https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.html">here</a>.</p>
<p>Our OS Software Solutions pillar aims to ensure the industry has a curated ecosystem of open source solutions* useful for reporting and submission of clinical data and analyses.</p>
<p><em>* R, python, or other languages</em></p>
<p>To achieve this we have agreed on 3 focus areas:</p>
<ul>
<li><p><em>Pharmaverse OSS suite</em> – oversee what we include/exclude and monitor feedback and sustainability</p></li>
<li><p><em>Our development teams</em> – offer support, e.g.&nbsp;helping bring more contributors / hackathons</p></li>
<li><p><em>Industry adoption</em> – advising on pathways to increase industry usage, e.g.&nbsp;continued maintenance of our examples page</p></li>
</ul>
<section id="pharmaverse-oss-suite" class="level3">
<h3 class="anchored" data-anchor-id="pharmaverse-oss-suite"><strong>Pharmaverse OSS suite</strong></h3>
<p>A question we often get asked is who decides what’s in and not in the pharmaverse?</p>
<p>We have the following explanation on the FAQ section of our homepage, which shows how we rely on our community here:</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/images/pharmaverse_inclusion.png" class="img-fluid"></p>
<p>So within the council we see our role here to oversee this process and ensure that at the heart of things you (our community) remain the ones empowered to decide on our curated suite of packages.</p>
<p>We do maintain <a href="https://pharmaverse.org/contribute/lead/">inclusion criteria</a> to help ensure the quality and integrity of all our recommended software solutions.</p>
</section>
<section id="our-development-teams" class="level3">
<h3 class="anchored" data-anchor-id="our-development-teams"><strong>Our development teams</strong></h3>
<p>We appreciate that maintaining packages to be used across the industry can be challenging, and often there will be more requests for new features than the number of people volunteering to help build and test those. So we want to find ways to help connect would-be contributors with the package development teams who need them most. If ever you’re a package lead and you find yourself in this situation please don’t hesitate to reach out to our council at pharmaverse.council@phuse.global.</p>
<p>Similarly from the perspective of those individuals who are new to open source and looking to help out, it can be daunting to make such connections and dive into contributing. If you find yourself in this position, then here’s a useful <a href="https://pharmaverse.github.io/blog/posts/2024-03-11_tips_for__first_/tips_for__first__time__contributors.html">blog</a> with tips to help you get started. You may also be interested in joining our very first official hackathon series…</p>
<section id="pharmaverse-hackathons" class="level4">
<h4 class="anchored" data-anchor-id="pharmaverse-hackathons"><strong>Pharmaverse Hackathons</strong></h4>
<p>One idea we’d like to try out in 2026 is that we want to run a series of hackathon events for either first time or more season contributors to get involved in a new open source project. Resources will be provided to help anyone to be able to take part, no matter if you might be new to topics like R or Git.</p>
<p>Here is our calendar of events:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Package</th>
<th>Target Date</th>
<th>Timezone</th>
<th>Sign-up</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>{teal}</code> - @ R/Medicine conference</td>
<td>April 23rd</td>
<td>PST</td>
<td><a href="https://rconsortium.github.io/RMedicine_website/Hackathon.html">Link</a></td>
</tr>
<tr class="even">
<td><code>{xportr}</code></td>
<td>May 21st</td>
<td>EST</td>
<td><em>TBA</em></td>
</tr>
<tr class="odd">
<td><code>{aNCA}</code></td>
<td>July 16th</td>
<td>CET</td>
<td><em>TBA</em></td>
</tr>
<tr class="even">
<td><code>{autoslider}</code> - @ R/Pharma conference</td>
<td>Week of Sept 28th</td>
<td>CST</td>
<td><em>TBA</em></td>
</tr>
<tr class="odd">
<td><code>{gtsummary}</code> &amp; <code>{cards/x}</code> - @ R/Pharma conference</td>
<td>Week of Sept 28th</td>
<td>PST</td>
<td><em>TBA</em></td>
</tr>
<tr class="even">
<td><code>{logrx}</code></td>
<td>Early November</td>
<td>EST</td>
<td><em>TBA</em></td>
</tr>
</tbody>
</table>
<p>Each hackathon will consist of the following structure:</p>
<ul>
<li><p><em>Week 1 (Preparation)</em>: We’ll host a 60-minute kick-off to introduce the package, a selection of curated issues, and contributor guidelines.</p></li>
<li><p><em>Week 2 (Execution)</em>: Our 3–4 hour hackathon event will take place, where you’ll be able to try out a contribution supported by OS mentors and developers from the package team.</p></li>
<li><p><em>Week 3 (Wrap-Up)</em>: Any pull requests will be reviewed so you can receive any useful feedback, and then a final office hour session will be offered to conclude and celebrate your contributions. We hope this will be the first step of you wanting to get more involved in pharmaverse!</p></li>
</ul>
</section>
</section>
<section id="industry-adoption" class="level3">
<h3 class="anchored" data-anchor-id="industry-adoption"><strong>Industry adoption</strong></h3>
<p>Our final commitment is to provide pathways to enable wider industry adoption of all our solutions. We all have built such an amazing resource under pharmaverse here, so we want to maximize the benefit for all patients across the world.</p>
<p>So you’ll see us actively showcasing pharmaverse OS software solutions in many different forms, and one such is by active maintenance of our <a href="https://pharmaverse.github.io/examples/">examples site</a>. Please do read more <a href="https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse__examples.html">here</a> - this is a wonderful resource for new users, demonstrating how the beauty of open source is truly in how many solutions come together to form a whole greater than the sum of the individual parts.</p>
<p>To share an often used quote in this space: <em>“In open source, we feel strongly that the future is only won through 1+1 being much more than 2.”</em></p>
<!--------------- appendices go here ----------------->
</section>
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:47.173106</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-03-06-pharmaverse-pillar/pharmaverse-pillar-oss.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{doyle_and_ross_farrugia2026,
  author = {Doyle and Ross Farrugia, Orla},
  title = {Pharmaverse {Pillar:} {OSS} and Our 2026 {Hackathon}
    {Calendar}},
  date = {2026-03-06},
  url = {https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/pharmaverse-pillar-oss.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-doyle_and_ross_farrugia2026" class="csl-entry quarto-appendix-citeas">
Doyle and Ross Farrugia, Orla. 2026. <span>“Pharmaverse Pillar: OSS and
Our 2026 Hackathon Calendar.”</span> March 6, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/pharmaverse-pillar-oss.html">https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/pharmaverse-pillar-oss.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/pharmaverse-pillar-oss.html</guid>
  <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-03-06-pharmaverse-pillar/pharmaverse.png" medium="image" type="image/png" height="128" width="144"/>
</item>
<item>
  <title>pharmaverse Pillars</title>
  <dc:creator>Pharmaverse Council</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="hi-pharmaverse-community" class="level2">
<h2 class="anchored" data-anchor-id="hi-pharmaverse-community"><strong>Hi pharmaverse community!</strong></h2>
<p>Big news from the council: after our late‑2025 strategy session, we’ve formalized the pharmaverse pillars for 2026 — a friendly framework to give clearer direction, focus effort, and help members plug in where they can make the biggest impact.</p>
<p>To start, we thought about…</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://pharmaverse.org"><img src="https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/images/clipboard-852172252.png" class="img-fluid figure-img"></a></p>
<figcaption>pharmaverse.org</figcaption>
</figure>
</div>
<section id="why-pillars" class="level3">
<h3 class="anchored" data-anchor-id="why-pillars"><strong>Why pillars?</strong></h3>
<p>Pillars give us shared priorities without getting in the way of how we collaborate. They make it easier to find people working on what you care about, streamline decision‑making, and create clear channels for contributions and ideas.</p>
<p>The <strong>4 pillars</strong> are:</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/images/clipboard-2666279582.png" class="img-fluid"></p>
<p>Pillar Leads:</p>
<ul>
<li><p>OS Software Solutions: Ross Farrugia, Orla Doyle</p></li>
<li><p>Community: Ashley Tarasiewicz, Alice Ehmann</p></li>
<li><p>PHUSE Working Group: Julia Gnatek, Nick Masel</p></li>
<li><p>Future Focus: Andre Couturier, Marcin Dubel</p></li>
</ul>
<p>Each pillar will be led by a pair of council members where their role will be to translate ideas into tangible actions or initiatives that are valuable to our sustaining and growing our community.</p>
<p>If you have questions, ideas, or want to join a pillar effort, any of the pillar leads above are your first point of contact - you can reach any pillar lead via <a href="https://pharmaverse.slack.com">pharmaverse/slack</a>!</p>
<p>Over the next few months, look for blog posts relating to each pillar!</p>
<p>We’re excited to see how these pillars help everyone find meaningful ways to contribute and collaborate. Thanks for being part of this community — let’s build something useful, maintainable, and a little bit delightful.</p>
<p>— The pharmaverse Council (and your friendly pillar leads)</p>
<!--------------- appendices go here ----------------->
</section>
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:35:45.442633</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{council2026,
  author = {Council, Pharmaverse},
  title = {Pharmaverse {Pillars}},
  date = {2026-02-26},
  url = {https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-council2026" class="csl-entry quarto-appendix-citeas">
Council, Pharmaverse. 2026. <span>“Pharmaverse Pillars.”</span> February
26, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.html">https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse-pillars.html</guid>
  <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-02-26-pharmaverse-pillars/pharmaverse.png" medium="image" type="image/png" height="128" width="144"/>
</item>
<item>
  <title>Welcome, Nick Masel</title>
  <dc:creator>pharmaverse council</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/new__council__members.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>Hi pharmaverse community,</p>
<p>On behalf of the council we are pleased to announce that Nick Masel will be taking over from Sumesh Kalappurakal as the J&amp;J representative on the Pharmaverse Council. Please join us in thanking Sumesh for his leadership and foresight as one of our original pharmaverse co-founders, and in welcoming Nick to the council!</p>
<p>To learn more about our council please check our <a href="https://pharmaverse.org/contribute/council/">site page</a>, and you can reach all of us using: pharmaverse.council@phuse.global.</p>
<p><strong>Bio:</strong></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/NickMasel.png" class="img-fluid figure-img"></p>
<figcaption>Nick Masel</figcaption>
</figure>
</div>
<p>Nick Masel is Associate Director, Clinical &amp; Statistical Programming (Technology Solutions) at Johnson &amp; Johnson, where he has helped implement infrastructure and drive R adoption since 2019. He has previously served on the R Consortium Infrastructure Steering Committee (ISC) and for the last three years has co-led PHUSE’s Data Visualization &amp; Open Source Technology (DVOST) Working Group. Nick is an active contributor to the Pharmaverse ecosystem as a package developer and maintainer, working at the intersection of open-source tooling, data visualization, and regulated clinical and statistical programming to deliver reproducible, scalable solutions for pharmaceutical programming teams.</p>
<!--------------- appendices go here ----------------->
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:36:06.926962</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_new__counci.../new__council__members.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{council2026,
  author = {council, pharmaverse},
  title = {Welcome, {Nick} {Masel}},
  date = {2026-02-20},
  url = {https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/new__council__members.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-council2026" class="csl-entry quarto-appendix-citeas">
council, pharmaverse. 2026. <span>“Welcome, Nick Masel.”</span> February
20, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/new__council__members.html">https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/new__council__members.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/new__council__members.html</guid>
  <pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-02-20_new_council/pharmaverse.png" medium="image" type="image/png" height="128" width="144"/>
</item>
<item>
  <title>A Star is Born: Why GitHub Stars Are Vital to the Pharmaverse</title>
  <dc:creator>Jeff Dickinson</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/a-star-is-born.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="the-smallest-contribution-youre-probably-not-making" class="level2">
<h2 class="anchored" data-anchor-id="the-smallest-contribution-youre-probably-not-making">The Smallest Contribution You’re Probably Not Making</h2>
<p>You’ve used <code>{admiral}</code> to derive your <code>ADSL</code>. You’ve leaned on <code>{metacore}</code> to wrangle your metadata. You’ve validated your XPT files with <code>{xportr}</code> and scored your package risk with <code>{riskmetric}</code>. These tools have saved you hours, reduced errors, and helped you build CDISC-compliant submissions that you can be proud of.</p>
<p>So let me ask you a direct question: <strong>have you starred those repositories on GitHub?</strong></p>
<p>If the honest answer is no, you’re not alone — and this post is for you.</p>
<hr>
</section>
<section id="what-is-a-github-star-really" class="level2">
<h2 class="anchored" data-anchor-id="what-is-a-github-star-really">What Is a GitHub Star, Really?</h2>
<p>On the surface, a GitHub star looks like a simple bookmarking mechanism. You click the ⭐ button on a repository, and it gets added to your “starred” list for easy retrieval later. Simple enough.</p>
<p>But in the open-source world, stars are much more than bookmarks. They are a <strong>public signal of trust, adoption, and community health</strong>. They are the currency through which the broader developer ecosystem evaluates whether a project is worth its attention. And in the pharmaverse — where we are actively working to prove to regulators, IT departments, company leadership, and the broader pharmaceutical industry that open-source R tools are production-ready — that signal matters enormously.</p>
<hr>
</section>
<section id="why-stars-matter-more-than-you-think" class="level2">
<h2 class="anchored" data-anchor-id="why-stars-matter-more-than-you-think">Why Stars Matter More Than You Think</h2>
<section id="stars-influence-discoverability" class="level3">
<h3 class="anchored" data-anchor-id="stars-influence-discoverability">1. Stars Influence Discoverability</h3>
<p>GitHub’s search algorithms use star counts as a key ranking signal. When a clinical programmer who is new to the pharmaverse searches for “ADaM R” or “CDISC R package”, the packages that appear at the top of those results are influenced — in part — by how many stars they have. A package with 50 stars looks like a niche experiment. A package with 500 stars looks like an industry standard.</p>
<p>We want the pharmaverse to look like what it actually is: the <strong>de facto open-source toolkit for clinical reporting in R</strong>. Stars help make that case.</p>
</section>
<section id="stars-signal-community-health-to-decision-makers" class="level3">
<h3 class="anchored" data-anchor-id="stars-signal-community-health-to-decision-makers">2. Stars Signal Community Health to Decision Makers</h3>
<p>When a statistician at a pharmaceutical company proposes adopting <code>{admiral}</code> for their ADaM pipeline, they will face scrutiny. Their IT colleagues, their validation teams, and their management will look at that GitHub repository and ask: <em>Is this actively maintained? Does anyone use this? Can we trust it?</em></p>
<p>Star counts — alongside download statistics, test coverage, commit frequency, and contributor counts — are among the first things people use to answer those questions. A healthy star count communicates that this package is <strong>used by real people, in real organizations, doing real work</strong>. It lowers the perceived risk of adoption.</p>
<p>For those of us who have spent years making the case for open-source tools in pharma, every star on a pharmaverse repository is another data point in that argument.</p>
</section>
<section id="stars-are-meaningful-feedback-for-maintainers" class="level3">
<h3 class="anchored" data-anchor-id="stars-are-meaningful-feedback-for-maintainers">3. Stars Are Meaningful Feedback for Maintainers</h3>
<p>Open-source maintainers in the pharmaverse are often donating their time on top of demanding full-time jobs. They write vignettes, triage issues, review pull requests, and cut releases — frequently without any direct recognition from the people who benefit most from their work.</p>
<p>A star is not just a number. It is a <strong>thank you note that scales</strong>. When a maintainer opens their repository and sees that the star count has grown, it communicates something important: <em>people are finding this, using this, and valuing this</em>. That feedback matters for morale, and morale matters for sustainability. The packages you depend on are only as healthy as the people who maintain them.</p>
</section>
<section id="stars-factor-into-organizational-prioritization" class="level3">
<h3 class="anchored" data-anchor-id="stars-factor-into-organizational-prioritization">4. Stars Factor Into Organizational Prioritization</h3>
<p>Within many pharmaceutical companies and the organizations that develop pharmaverse packages — including those contributing to the admiral family, the NEST framework, the R Validation Hub, and others — resource allocation decisions are influenced by signals of community engagement. Star counts and download trends are real inputs into conversations about where to invest developer time and organizational support.</p>
<p>When you star a package, you are quietly but meaningfully adding your voice to the case for its continued investment.</p>
</section>
<section id="stars-help-justify-open-source-in-pharma" class="level3">
<h3 class="anchored" data-anchor-id="stars-help-justify-open-source-in-pharma">5. Stars Help Justify Open-Source in Pharma</h3>
<p>Our industry is not the easiest audience for open-source advocacy. We operate in a validated, regulated environment where change is scrutinized and risk aversion runs deep. The transition to open-source tools — and the cultural shift toward open, collaborative tool development — is still very much in progress.</p>
<p>GitHub stars are one of the few public-facing metrics that non-technical stakeholders can easily interpret. A director reviewing a proposal to adopt <code>{xportr}</code> may not understand R package architecture, but they do understand the difference between a tool with 20 stars and one with 500. That number tells a story, and we should be telling it accurately.</p>
<hr>
</section>
</section>
<section id="the-visibility-gap" class="level2">
<h2 class="anchored" data-anchor-id="the-visibility-gap">The Visibility Gap</h2>
<p>Here’s the honest reality: pharmaverse packages are used far more than their star counts suggest. Many clinical programmers access these tools through internal environments where GitHub access is limited or indirect, deriving real value without ever navigating to the source repository. Stars only reflect the people who made it to the repo — and we can do better.</p>
<section id="how-to-star-a-repository" class="level3">
<h3 class="anchored" data-anchor-id="how-to-star-a-repository">How to Star a Repository</h3>
<p>Starring a repository takes just a few seconds. Here’s where to click:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/github-star-button.png" class="img-fluid figure-img"></p>
<figcaption>GitHub star button location</figcaption>
</figure>
</div>
<ol type="1">
<li>Navigate to any pharmaverse package repository on GitHub</li>
<li>Look for the ⭐ <strong>Star</strong> button in the top-right area of the repository, just below your profile menu</li>
<li>Click it once — that’s it!</li>
</ol>
<p>The button will light up and turn yellow, confirming your star has been added. You can view all your starred repositories anytime in your GitHub profile under the “Stars” tab.</p>
<hr>
</section>
</section>
<section id="what-you-can-do-right-now" class="level2">
<h2 class="anchored" data-anchor-id="what-you-can-do-right-now">What You Can Do Right Now</h2>
<p>If you use any of the following packages, please take 60 seconds and star their repositories:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Package</th>
<th>GitHub Repository</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>{admiral}</code></td>
<td><a href="https://github.com/pharmaverse/admiral">pharmaverse/admiral</a></td>
</tr>
<tr class="even">
<td><code>{admiralonco}</code></td>
<td><a href="https://github.com/pharmaverse/admiralonco">pharmaverse/admiralonco</a></td>
</tr>
<tr class="odd">
<td><code>{Tplyr}</code></td>
<td><a href="https://github.com/atorus-research/Tplyr">atorus-research/Tplyr</a></td>
</tr>
<tr class="even">
<td><code>{rtables}</code></td>
<td><a href="https://github.com/insightsengineering/rtables">insightsengineering/rtables</a></td>
</tr>
<tr class="odd">
<td><code>{teal}</code></td>
<td><a href="https://github.com/insightsengineering/teal">insightsengineering/teal</a></td>
</tr>
<tr class="even">
<td><code>{tern}</code></td>
<td><a href="https://github.com/insightsengineering/tern">insightsengineering/tern</a></td>
</tr>
<tr class="odd">
<td><code>{tidytlg}</code></td>
<td><a href="https://github.com/pharmaverse/tidytlg">pharmaverse/tidytlg</a></td>
</tr>
<tr class="even">
<td><code>{tfrmt}</code></td>
<td><a href="https://github.com/GSK-Biostatistics/tfrmt/">GSK-Biostatistics/tfrmt</a></td>
</tr>
<tr class="odd">
<td><code>{visR}</code></td>
<td><a href="https://github.com/openpharma/visR/">openpharma/visR</a></td>
</tr>
<tr class="even">
<td><code>{ggsurvfit}</code></td>
<td><a href="https://github.com/pharmaverse/ggsurvfit">pharmaverse/ggsurvfit</a></td>
</tr>
<tr class="odd">
<td><code>{aNCA}</code></td>
<td><a href="https://github.com/pharmaverse/aNCA">pharmaverse/aNCA</a></td>
</tr>
<tr class="even">
<td><code>{rhino}</code></td>
<td><a href="https://github.com/Appsilon/rhino">Appsilon/rhino</a></td>
</tr>
<tr class="odd">
<td><code>{metacore}</code></td>
<td><a href="https://github.com/atorus-research/metacore">atorus-research/metacore</a></td>
</tr>
<tr class="even">
<td><code>{metatools}</code></td>
<td><a href="https://github.com/pharmaverse/metatools">pharmaverse/metatools</a></td>
</tr>
<tr class="odd">
<td><code>{xportr}</code></td>
<td><a href="https://github.com/atorus-research/xportr">atorus-research/xportr</a></td>
</tr>
<tr class="even">
<td><code>{riskmetric}</code></td>
<td><a href="https://github.com/pharmaR/riskmetric">pharmaR/riskmetric</a></td>
</tr>
<tr class="odd">
<td><code>{sdtm.oak}</code></td>
<td><a href="https://github.com/pharmaverse/sdtm.oak/">pharmaverse/sdtm.oak</a></td>
</tr>
<tr class="even">
<td><code>{pharmaverseadam}</code></td>
<td><a href="https://github.com/pharmaverse/pharmaverseadam">pharmaverse/pharmaverseadam</a></td>
</tr>
<tr class="odd">
<td><code>{pharmaversesdtm}</code></td>
<td><a href="https://github.com/pharmaverse/pharmaversesdtm">pharmaverse/pharmaversesdtm</a></td>
</tr>
</tbody>
</table>
<p>You can also see many pharmaverse packages in action in the <a href="https://pharmaverse.github.io/examples/">pharmaverse examples site</a> <a href="https://github.com/pharmaverse/examples">pharmaverse/examples</a> which you can also star!</p>
<p>Starring a repository requires a free GitHub account. If you don’t have one, creating one takes about two minutes and is well worth it — it also opens the door to participating more directly in the community through issue reports, discussions, and eventually contributions.</p>
<hr>
</section>
<section id="make-it-a-habit" class="level2">
<h2 class="anchored" data-anchor-id="make-it-a-habit">Make It a Habit</h2>
<p>The best time to star a repository is when you first discover that a package solves a problem you have. The second best time is right now.</p>
<p>I’d encourage you to take a few minutes today to review which pharmaverse tools are part of your workflow and star the ones you haven’t yet. Then consider sharing this post with a colleague who you know depends on these tools but may not have thought about GitHub engagement before.</p>
<p>The pharmaverse has grown into something remarkable — a genuine, cross-industry collaboration that is reshaping how clinical data science is practiced. It runs on contributions, and those contributions take many forms. Code, documentation, issue reports, and conference presentations are all vital. But so is the quietest contribution of all: clicking ⭐ to say <em>I use this, I value this, and I want it to keep growing</em>.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:35:33.933604</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-02-17-a-star-is-born/a-star-is-born.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{dickinson2026,
  author = {Dickinson, Jeff},
  title = {A {Star} Is {Born:} {Why} {GitHub} {Stars} {Are} {Vital} to
    the {Pharmaverse}},
  date = {2026-02-17},
  url = {https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/a-star-is-born.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-dickinson2026" class="csl-entry quarto-appendix-citeas">
Dickinson, Jeff. 2026. <span>“A Star Is Born: Why GitHub Stars Are Vital
to the Pharmaverse.”</span> February 17, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/a-star-is-born.html">https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/a-star-is-born.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/a-star-is-born.html</guid>
  <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-02-18-a-star-is-born/github-stars-logo_Color.webp" medium="image" type="image/webp"/>
</item>
<item>
  <title>Get Ready for the PHUSE US Connect Pavilions!</title>
  <dc:creator>Michael Rimler</dc:creator>
  <dc:creator>PHUSE </dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-02-16-get-ready-for-the-p/get-ready-for-the-phuse-us-connect-pavilions.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>Howdy, Phriends!</p>
<p>In case you missed it - there is a massive PHUSE Connect coming up soon in Austin, Texas! What’s so massive about it? There’s so much content planned that we’ve extended it by a full day! I guess it’s true what they say - Everything’s bigger in Texas!</p>
<p>One of the many expansions is the innovation of the four <a href="https://www.phuse-events.org/attend/frontend/reg/tOtherPage.csp?pageID=73387&amp;ef_sel_menu=5382&amp;eventID=88">PHUSE Pavilions</a><sup>TM</sup> to grab your interest:</p>
<ul>
<li><p>Data Transparency (<a href="https://www.phuse-events.org/attend/frontend/reg/tOtherPage.csp?pageID=81398&amp;eventID=88&amp;eventID=88" title="Data Transparency">agenda</a>)</p></li>
<li><p>Open Source (<a href="https://www.phuse-events.org/attend/frontend/reg/tOtherPage.csp?pageID=81492&amp;ef_sel_menu=5790&amp;eventID=88&amp;eventID=88&amp;eventID=88" title="Open Source">agenda</a>)</p></li>
<li><p>Real-World Evidence (<a href="https://www.phuse-events.org/attend/frontend/reg/tOtherPage.csp?pageID=81485&amp;ef_sel_menu=5789&amp;eventID=88&amp;eventID=88&amp;eventID=88" title="Real-World Evidence">agenda</a>)</p></li>
<li><p>Vulcan FHIR Forge (<a href="https://www.phuse-events.org/attend/frontend/reg/tOtherPage.csp?pageID=81503&amp;ef_sel_menu=5802&amp;eventID=88&amp;eventID=88" title="Vulcan FHIR Forge">agenda</a>)</p></li>
</ul>
<p>And what’s the best part? They are all <u><strong>FREE</strong></u> with your Connect ticket! No additional fee. No additional registration. Thanks to our Pavilion Sponsors, all of this focused and expert-provided content is available to PHUSE attendees and included in your 2026 PHUSE US Connect registration.</p>
<p>And for those interested in <u>pharmaverse</u>, you’ll find contributors and Council members in the room for the Open Source Pavilion. Whether it’s facilitating a workshop on <strong>Metadata-Driven Automation</strong>, on the panel on <strong>Open Source Change Management</strong>, facilitating a workshop on <strong>AI in Clinical Data Analysis,</strong> or making connections at our novel <strong>Open Source in Pharma Block Party</strong> - <a href="https://pharmaverse.org/"><strong>pharmaverse</strong></a> will be present and engaged. And, this is just the Open Source Pavilion agenda - taking place over 2 of the 4 days and in just one of the 10 concurrent rooms of activity. That’s TEN - One-Zero - you know, like the ten-gallon hat?</p>
<p>So, saddle up and get ready! We ain’t horsin’ around this time. See you in Austin!</p>
<p>Michael Rimler, PHUSE Open Source Director</p>
<!--------------- appendices go here ----------------->
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:37.987105</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2026-02-16-get-ready-for-the-p/get-ready-for-the-phuse-us-connect-pavilions.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{rimler2026,
  author = {Rimler, Michael and , PHUSE},
  title = {Get {Ready} for the {PHUSE} {US} {Connect} {Pavilions!}},
  date = {2026-02-16},
  url = {https://pharmaverse.github.io/blog/posts/2026-02-16-get-ready-for-the-p/get-ready-for-the-phuse-us-connect-pavilions.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-rimler2026" class="csl-entry quarto-appendix-citeas">
Rimler, Michael, and PHUSE. 2026. <span>“Get Ready for the PHUSE US
Connect Pavilions!”</span> February 16, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-02-16-get-ready-for-the-p/get-ready-for-the-phuse-us-connect-pavilions.html">https://pharmaverse.github.io/blog/posts/2026-02-16-get-ready-for-the-p/get-ready-for-the-phuse-us-connect-pavilions.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <category>Conferences</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-02-16-get-ready-for-the-p/get-ready-for-the-phuse-us-connect-pavilions.html</guid>
  <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-02-16-get-ready-for-the-p/pharmaverse.png" medium="image" type="image/png" height="128" width="144"/>
</item>
<item>
  <title>pharmaversesdtm 1.4.0 Release</title>
  <dc:creator>Lina Patil</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm_140_release.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p><img src="https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm.png" class="img-fluid"></p>
<p>We are pleased to announce the release of <strong>{pharmaversesdtm} 1.4.0</strong> 🎉<br>
This release expands the breadth of SDTM test data available in the package, with a particular focus on <strong>neurology and oncology</strong>, alongside several targeted enhancements and fixes.</p>
<section id="whats-new-in-1.4.0" class="level2">
<h2 class="anchored" data-anchor-id="whats-new-in-1.4.0">✨ What’s New in 1.4.0</h2>
<section id="new-neurological-sdtm-test-datasets" class="level3">
<h3 class="anchored" data-anchor-id="new-neurological-sdtm-test-datasets">🧠 New neurological SDTM test datasets</h3>
<p>Version 1.4.0 introduces a set of <strong>neurology-focused SDTM test datasets</strong>, extending the package coverage of therapeutic areas:</p>
<ul>
<li><code>dm_neuro</code> - demographic data for neurological studies<br>
</li>
<li><code>nv_neuro</code> - neurological findings<br>
</li>
<li><code>suppnv_neuro</code> - supplemental qualifiers for neurological findings<br>
</li>
<li><code>ag_neuro</code> - associated groups for neurological domains<br>
</li>
<li><code>lb_neuro</code> - neurological laboratory test data</li>
</ul>
<p>These datasets are intended to support development, testing, and examples for neurology-specific workflows.</p>
</section>
<section id="new-and-updated-variables" class="level3">
<h3 class="anchored" data-anchor-id="new-and-updated-variables">📊 New and updated variables</h3>
<p>Several existing datasets have been enhanced:</p>
<ul>
<li><strong><code>VISITDY</code></strong> has been added to the <code>pc</code> domain to support consistent visit day derivations.</li>
<li><strong><code>BRTHDTC</code></strong> has been added to both <code>dm</code> and <code>dm_metabolic</code>, improving demographic completeness.</li>
<li>The <code>qs_ophtha</code> dataset now uses an updated <code>QSTESTCD</code> aligned with CDISC terminology and has been simplified for easier use in examples.</li>
</ul>
</section>
<section id="oncology-data-improvements" class="level3">
<h3 class="anchored" data-anchor-id="oncology-data-improvements">🧬 Oncology data improvements</h3>
<p>This release also includes important updates for oncology use cases:</p>
<ul>
<li>Corrections to <code>rs_onco_pcwg3</code>, addressing misclassified progression indicators and response records.</li>
<li>A new oncology biomarker dataset, <strong><code>lb_onco_pcwg3</code></strong>, providing PSA measurements aligned with PCWG criteria.</li>
</ul>
</section>
<section id="neurological-dataset-enhancements" class="level3">
<h3 class="anchored" data-anchor-id="neurological-dataset-enhancements">🧠 Neurological dataset enhancements</h3>
<p>Neurological laboratory data includes biomarkers Alpha Synuclein Seed Amplification Assay (CSF), Lumipulse G pTau217, Lumipulse G β-Amyloid 1-42, and the ratio of pTau217 and β-Amyloid 1-42.</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/lb_neuro.png" class="img-fluid"></p>
</section>
<section id="documentation-and-developer-updates" class="level3">
<h3 class="anchored" data-anchor-id="documentation-and-developer-updates">📚 Documentation and developer updates</h3>
<p>To help you explore datasets by therapeutic area, the <strong>reference pages</strong> have been reorganized to group datasets under meaningful categories such as metabolic, neurological, and oncology. This makes navigation easier for researchers and developers alike.</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/dataset_grouping.png" class="img-fluid"></p>
</section>
</section>
<section id="installation" class="level2">
<h2 class="anchored" data-anchor-id="installation">📦 Installation</h2>
<p>You can install <strong>pharmaversesdtm 1.4.0</strong> from CRAN:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pharmaversesdtm"</span>)</span></code></pre></div></div>
</div>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:33:43.627939</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_my__blog/pharmaversesdtm_140_release.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{patil2026,
  author = {Patil, Lina},
  title = {Pharmaversesdtm 1.4.0 {Release}},
  date = {2026-01-23},
  url = {https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm_140_release.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-patil2026" class="csl-entry quarto-appendix-citeas">
Patil, Lina. 2026. <span>“Pharmaversesdtm 1.4.0 Release.”</span> January
23, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm_140_release.html">https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm_140_release.html</a>.
</div></div></section></div> ]]></description>
  <category>SDTM</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm_140_release.html</guid>
  <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-01-23_pharmaversesdtm14/pharmaversesdtm.png" medium="image" type="image/png" height="162" width="144"/>
</item>
<item>
  <title>Pharmaverse and Containers</title>
  <dc:creator>Ben Straub and Maciej Nasinski</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-01-18_pharmaverse_containers/pharmaverse_and__containers.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="streamlining-our-pharmaverse-blog-reducing-publishing-time-with-containers" class="level2">
<h2 class="anchored" data-anchor-id="streamlining-our-pharmaverse-blog-reducing-publishing-time-with-containers">Streamlining Our Pharmaverse Blog: Reducing Publishing Time with containers</h2>
<p>As an active contributor to the pharmaverse blog, I’ve always appreciated the opportunity to share new insights and tools with our community. The pharmaverse blog has some interesting features for publishing. While the blog publishing process has been effective, I was wondering if there was a way to optimize our workflows. Currently, the CI/CD pipeline for publishing the blog typically took about 17 minutes to deploy a new post. Containers are always batted around as solutions. Unfortunately, I was unsure how to create a new container/image to meet my needs and relied on some straight <code>install.packages()</code> in the CI/CD pipeline. Luckily, I crossed paths with the fabulous Maciej Nasinski and we built a specific container for the publishing process for the pharmaverse blog, which allowed for a notable reduction in publishing time.</p>
<p>Below I will discuss how the pharmaverse container image has improved our blog’s publishing workflow, bringing our deployment time down to approximately 5 minutes. We are also interested in feedback on potential other uses of this container (like devcontainers) or building additional containers for certain purposes. For those interested, we would be happy to provide a tutorial on containers or get in touch if you have ideas or want to get involved!</p>
</section>
<section id="the-previous-approach-package-installation-overhead" class="level2">
<h2 class="anchored" data-anchor-id="the-previous-approach-package-installation-overhead"><strong>The Previous Approach:</strong> Package Installation overhead</h2>
<p>Our prior CI/CD (GitHub Actions) workflow for building and deploying the pharmaverse blog, while comprehensive, included a time-consuming step. It used the a straight “Install dependencies” step from the r-lib actions, which necessitated installing a range of pharmaverse specific R packages during each run. As we added more packages to the pharmaverse to the blog, this became really cumbersome!</p>
<p>The relevant section of our old build-deploy job highlighted this:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1">  build<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>deploy<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb1-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... other configurations ...</span></span>
<span id="cb1-3">    steps<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb1-4">      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... checkout and setup Quarto ...</span></span>
<span id="cb1-5">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Setup R</span>
<span id="cb1-6">        uses<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> r<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>lib<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>actions<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>setup<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>r<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span>v2</span>
<span id="cb1-7">        with<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb1-8">          use<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>public<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>rspm<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> true</span>
<span id="cb1-9"></span>
<span id="cb1-10">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Install dependencies</span>
<span id="cb1-11">        uses<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> r<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>lib<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>actions<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>setup<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>r<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>dependencies<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span>v2</span>
<span id="cb1-12">        with<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb1-13">          packages<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">|</span></span>
<span id="cb1-14">            jsonlite</span>
<span id="cb1-15">            tidyverse</span>
<span id="cb1-16">            spelling</span>
<span id="cb1-17">            janitor</span>
<span id="cb1-18">            diffdf</span>
<span id="cb1-19">            admiral</span>
<span id="cb1-20">            admiralonco</span>
<span id="cb1-21">            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... and many, many more packages ...</span></span>
<span id="cb1-22">            haven</span>
<span id="cb1-23">      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... other steps like install tinytex and publish ...</span></span></code></pre></div></div>
<p>This “Install dependencies” step, involving a substantial list of pharmaverse packages, was a primary contributor to the 17-minute execution time. Each workflow run involved downloading and configuring these packages, extending the overall deployment duration.</p>
</section>
<section id="adopting-the-pharmaverse-container-image-an-efficient-alternative" class="level2">
<h2 class="anchored" data-anchor-id="adopting-the-pharmaverse-container-image-an-efficient-alternative">Adopting the pharmaverse container image: An Efficient Alternative</h2>
<p>The solution to this challenge came with the introduction of the pharmaverse container image: <code>ghcr.io/pharmaverse/docker_pharmaverse:4.5.1</code>. This container image was specifically designed for pharmaceutical data analysis, featuring over 40 essential pharmaverse packages pre-installed. These packages cover various functionalities, including CDISC ADaM/SDTM, clinical trial reporting, and regulatory submissions. Built upon the rocker/tidyverse image and incorporating R 4.5.1, it provides a pre-configured environment.</p>
<p>By integrating this image into our CI/CD pipeline (GitHub Actions), we could bypass the extensive package installation phase.</p>
<p>Here’s an overview of our updated build-deploy job:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">  build<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>deploy<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-2">    needs<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Update<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>post<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>dates</span>
<span id="cb2-3">    runs<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>on<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> ubuntu<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>latest</span>
<span id="cb2-4">    container<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-5">      image<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ghcr.io/pharmaverse/docker_pharmaverse:4.5.1"</span></span>
<span id="cb2-6">    permissions<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-7">      contents<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> write</span>
<span id="cb2-8">    steps<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-9">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Check out repository</span>
<span id="cb2-10">        uses<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> actions<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>checkout<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span>v4</span>
<span id="cb2-11"></span>
<span id="cb2-12">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Configure Git safe directory</span>
<span id="cb2-13">        run<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> git config <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">--</span>global <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">--</span>add safe.directory <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>__w<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>blog<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>blog</span>
<span id="cb2-14"></span>
<span id="cb2-15">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Set up Quarto</span>
<span id="cb2-16">        uses<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> quarto<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>dev<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>quarto<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>actions<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>setup<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span>v2</span>
<span id="cb2-17">        with<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-18">            version<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>.<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">9.12</span></span>
<span id="cb2-19"></span>
<span id="cb2-20">      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># </span><span class="al" style="color: #AD0000;
background-color: null;
font-style: inherit;">NOTE</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">: Explicit R package installation is no longer required here.</span></span>
<span id="cb2-21"></span>
<span id="cb2-22">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Install tinytex</span>
<span id="cb2-23">        run<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> quarto install tool tinytex</span>
<span id="cb2-24"></span>
<span id="cb2-25">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Mark repo directory as safe</span>
<span id="cb2-26">        run<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> git config <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">--</span>global <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">--</span>add safe.directory <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>__w<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>blog<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>blog</span>
<span id="cb2-27"></span>
<span id="cb2-28">      <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> Publish</span>
<span id="cb2-29">        uses<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> quarto<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>dev<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>quarto<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>actions<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>publish<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span>v2</span>
<span id="cb2-30">        with<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-31">          path<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> . <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Path to your .qmd file</span></span>
<span id="cb2-32">          target<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> gh<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>pages  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Target branch for GitHub Pages</span></span>
<span id="cb2-33">        env<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span></span>
<span id="cb2-34">          GITHUB_TOKEN<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">$</span>{{ secrets.GITHUB_TOKEN }}</span></code></pre></div></div>
<p>The outcome of this change has been a consistent reduction in publishing time. Our blog now publishes in approximately 5 minutes. Yay!</p>
</section>
<section id="wider-applications-of-the-pharmaverse-container-image" class="level2">
<h2 class="anchored" data-anchor-id="wider-applications-of-the-pharmaverse-container-image">Wider Applications of the Pharmaverse Container Image</h2>
<p>While this update directly benefits our blog’s publishing, the pharmaverse container image offers broader utility. It is a valuable resource for:</p>
<ul>
<li>Pharmaceutical data analysis: Supporting tasks related to ADaM, SDTM, and TLFs.</li>
<li>Clinical trial programming: Assisting with regulatory submissions.</li>
<li>Reproducible research: Providing a consistent and verifiable environment.</li>
<li>Training &amp; education: Offering a ready-to-use setup for educational purposes.</li>
<li>CI/CD pipelines: Enhancing automated testing and reporting, as observed in our own workflow.</li>
<li>Collaborative development: Facilitating consistent environments across teams.</li>
</ul>
<section id="example-running-reproducible-rstudio-locally" class="level3">
<h3 class="anchored" data-anchor-id="example-running-reproducible-rstudio-locally">Example: Running Reproducible RStudio Locally</h3>
<p>To spin up a local RStudio instance using the pharmaverse image, you can use a container “one-liner.” This command condenses the entire configuration - networking, storage, and background execution - into a single execution string. It bridges your local folder to the container, allowing you to edit files “on the fly” without installing R or packages on your actual machine.</p>
<p>Choose the command that matches your operating system:</p>
<section id="linux-intel-macs-standard" class="level4">
<h4 class="anchored" data-anchor-id="linux-intel-macs-standard">1. Linux &amp; Intel Macs (Standard)</h4>
<p>For standard architecture, we set a simple password (<code>rstudio</code>) and mount the current directory.</p>
<p><code>docker run -d --name my_pharma_rstudio --rm -p 8787:8787 -e PASSWORD=rstudio -v "$(pwd)":/home/rstudio/project ghcr.io/pharmaverse/docker_pharmaverse:4.5.1</code></p>
</section>
<section id="apple-silicon-m1m2m3" class="level4">
<h4 class="anchored" data-anchor-id="apple-silicon-m1m2m3">2. Apple Silicon (M1/M2/M3)</h4>
<p><strong>Note:</strong> We do not yet natively support ARM64 architecture (e.g., Apple Silicon). The command below uses emulation (<code>--platform linux/amd64</code>) to run the image. We also disable authentication because the slower emulation speed can sometimes cause password setup to time out.</p>
<p><code>docker run -d --name my_pharma_rstudio --rm --platform linux/amd64 -p 8787:8787 -e DISABLE_AUTH=true -v "$(pwd)":/home/rstudio/project ghcr.io/pharmaverse/docker_pharmaverse:4.5.1</code></p>
</section>
<section id="what-does-this-command-do" class="level4">
<h4 class="anchored" data-anchor-id="what-does-this-command-do">What does this command do?</h4>
<ul>
<li>**<code>--rm</code> &amp; <code>-d**</code>: Runs the container in the background (detached) and automatically removes it when stopped, keeping your machine clean.</li>
<li><strong><code>-v "$(pwd)":...</code></strong>: Takes your <strong>P</strong>resent <strong>W</strong>orking <strong>D</strong>irectory and mounts it inside the container. Any file you save in RStudio’s “project” folder is instantly saved to your local computer.</li>
<li><strong><code>--platform linux/amd64</code></strong> <em>(Mac only)</em>: Forces your computer to emulate the Intel architecture required by the image.</li>
<li><strong><code>-e DISABLE_AUTH=true</code></strong> <em>(Mac only)</em>: Bypasses the login screen to ensure immediate access despite slower emulation speeds.</li>
</ul>
</section>
<section id="accessing-rstudio" class="level4">
<h4 class="anchored" data-anchor-id="accessing-rstudio">Accessing RStudio</h4>
<p>Once the command is running:</p>
<ol type="1">
<li>Open your browser to <code>http://localhost:8787</code>.</li>
<li><strong>Linux/Intel:</strong> Log in with user <code>rstudio</code> and password <code>rstudio</code>.</li>
<li><strong>Apple Silicon:</strong> You will be logged in automatically.</li>
</ol>
<p>You will see your local files mapped to the <code>project</code> folder in the Files pane, ready for analysis.</p>
</section>
</section>
</section>
<section id="engaging-with-the-pharmaverse-community" class="level2">
<h2 class="anchored" data-anchor-id="engaging-with-the-pharmaverse-community">Engaging with the Pharmaverse Community</h2>
<p>The pharmaverse container image mage represents a collaborative effort within the life sciences industry to provide open-source tools. For those working with pharmaverse packages and R in development, research, or CI/CD contexts, exploring this image may offer practical advantages in efficiency and reproducibility.</p>
<p>Explore the pharmaverse container image repository: <a href="https://github.com/pharmaverse/docker_pharmaverse">pharmaverse/docker_pharmaverse</a> Discover more about Pharmaverse: <a href="https://pharmaverse.org/">pharmaverse.org</a></p>
<p>We acknowledge the contributions of the pharmaverse community and the Rocker Project for their support in developing these resources.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:35:01.564608</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_pharmaverse.../pharmaverse_and__containers.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{straub_and_maciej_nasinski2026,
  author = {Straub and Maciej Nasinski, Ben},
  title = {Pharmaverse and {Containers}},
  date = {2026-01-18},
  url = {https://pharmaverse.github.io/blog/posts/2026-01-18_pharmaverse_containers/pharmaverse_and__containers.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-straub_and_maciej_nasinski2026" class="csl-entry quarto-appendix-citeas">
Straub and Maciej Nasinski, Ben. 2026. <span>“Pharmaverse and
Containers.”</span> January 18, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-01-18_pharmaverse_containers/pharmaverse_and__containers.html">https://pharmaverse.github.io/blog/posts/2026-01-18_pharmaverse_containers/pharmaverse_and__containers.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <category>Submissions</category>
  <category>Technical</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-01-18_pharmaverse_containers/pharmaverse_and__containers.html</guid>
  <pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-01-18_pharmaverse_containers/container.png" medium="image" type="image/png" height="146" width="144"/>
</item>
<item>
  <title>admiral 1.4 release</title>
  <dc:creator>Jeff Dickinson</dc:creator>
  <dc:creator>Ben Straub</dc:creator>
  <dc:creator>Edoardo Mancini</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral_14_release.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p><img src="https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral.png" class="img-fluid"></p>
<section id="admiral-1.4-is-here" class="level1">
<h1>admiral 1.4 is here!</h1>
<p>There’s nothing like a new {admiral} release to start the new year with a bang, and that’s exactly what we have for you with {admiral} 1.4! This release comes packed with few choice updates and some exciting new features (<strong>including our first AI integration!</strong>) that will undoubtedly improve your experience creating ADaMs in R. However, in line with our commitment to stability and maturity, we have once again reduced the number of breaking changes to an absolute minimum. Take a look at the rest of the blog post below to learn more about what to expect in <a href="https://pharmaverse.github.io/admiral/cran-release/">{admiral} 1.4</a>.</p>
<section id="tldr-what-is-in-this-release" class="level2">
<h2 class="anchored" data-anchor-id="tldr-what-is-in-this-release">TLDR: What is in this release?</h2>
<ul>
<li>{admiral} has partnered with <a href="https://www.kapa.ai/">kapa.ai</a> to introduce an AI-powered chatbot within every page of our websites.</li>
<li>We have added our first experimental functions: <code>derive_var_nfrlt()</code> and <code>convert_xxtpt_to_hours()</code>. These simplify time point and visit derivations.</li>
<li>There is a new ADAB template script and correspondingly new vignette. These will aid in creating Anti-drug Antibody Analysis Datasets</li>
<li>Several existing parameter derivation functions have been updated for greater robustness.</li>
<li>All the {admiral} templates can now be viewed directly from our website within the new <a href="https://pharmaverse.github.io/admiral/cran-release/articles/templates.html">Explore ADaM Templates</a>.</li>
<li>{admiral} is now integrated with NCI-CTCAE version 6.0 lab grading criteria for both SI and US units, with all grading metadata now maintained in a more readable JSON format for improved consistency and maintainability.</li>
<li><code>derive_var_atoxgr_dir()</code> received a small breaking change: the <code>abnormal_indicator</code> argument was replaced by <code>low_indicator</code> and <code>high_indicator</code> to support the updated CTCAE v6.0 criteria.</li>
<li><code>derive_var_merged_summary()</code> has been renamed to <code>derive_vars _merged_summary()</code> to align with programming conventions.</li>
</ul>
<p>Please peruse the <a href="https://pharmaverse.github.io/admiral/cran-release/news/index.html">Changelog</a> to see the full set of updates in {admiral} 1.4.</p>
<p>Let’s take a few deep-dives to explore some of these updates in more detail.</p>
</section>
<section id="deep-dive-1-kapa.ai-integration" class="level2">
<h2 class="anchored" data-anchor-id="deep-dive-1-kapa.ai-integration">Deep dive 1: kapa.ai integration</h2>
<p>We are thrilled to announce that {admiral} has partnered with <a href="https://www.kapa.ai/">kapa.ai</a> under their <a href="https://docs.kapa.ai/kapa-for-open-source">Open Source Program</a> to introduce an AI-powered chatbot within every page of our website. This LLM chatbot is trained using the documentation pages of {admiral} and all our therapeutic area extension packages as well as the {pharmaversesdtm} and {pharmaverseadam} data packages and the ADaM IG. Indeed, look out for it to be added to every other package in the {admiral} ecosystem in their upcoming releases this month. To use the chatbot, simply click on the “Ask AI” button at the bottom right corner of any website page and start asking away - you may find that you get redirected to a User Guide, a function reference page or the website of another {admiral} package that you didn’t even know existed!</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/kapa.png" class="img-fluid"></p>
</section>
<section id="deep-dive-2-experimental-functions" class="level2">
<h2 class="anchored" data-anchor-id="deep-dive-2-experimental-functions">Deep dive 2: Experimental functions!</h2>
<p><em>Experimental functions are a new class of functions, tagged with the <a href="https://pharmaverse.github.io/admiral/cran-release/reference/#experimental">“Experimental” badge</a>. This is our way of adding targeted, new functionality that we can quickly improve/modify without breaking our commitment to stability. The badge will be removed once the dev team feels the function is stable, and no deprecation messages will be given to the user if breaking changes are implemented before removing the experimental badge. However, {admiral} will document the breaking change in the Changelog. Once the “Experimental” badge is removed we will proceed with the normal deprecation cycle if needed.</em></p>
<p>Our first experimental functions help derive variables for time-point analysis. One such variable is <code>NFRLT</code> (Nominal Relative Time from First Dose), which is used extensively in pharmacokinetic analysis. This is the namesake variable for <code>derive_var_nfrlt()</code>. This function can be used to directly derive <code>NFRLT</code> in the Pharmacokinetic Concentrations (<code>PC</code>) domain and in the Exposure (<code>EX</code>) domain. These domains are typically combined to form the Pharmacokinetic Concentrations Analysis Data (<code>ADPC</code>). Under the hood of this function is <code>convert_xxtpt_to_hours()</code>, which converts timepoint variables such as <code>PCTPT</code> to numeric hours using regular expressions. The hours computed from <code>convert_xxtpt_to_hours()</code> are combined with the days from a visit variable such as <code>VISITDY</code> to derive <code>NFRLT</code>. Note that the unit variable <code>FRLTU</code> can also be derived, and there are multiple output unit options (hours, days, weeks, minutes).</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"admiral"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">repos =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://cloud.r-project.org"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Installing package into '/home/runner/work/_temp/Library'
(as 'lib' is unspecified)</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(admiral)</span>
<span id="cb3-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tibble)</span>
<span id="cb3-3"></span>
<span id="cb3-4">adpc_nfrlt <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tribble</span>(</span>
<span id="cb3-5">  <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>USUBJID, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>VISITDY, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>PCTPT,           <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>PCSTRESN,</span>
<span id="cb3-6">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pre-dose"</span>,       <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span>,</span>
<span id="cb3-7">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"30M Post-dose"</span>,  <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.2</span>,</span>
<span id="cb3-8">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1H Post-dose"</span>,   <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.4</span>,</span>
<span id="cb3-9">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2H Post-dose"</span>,   <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">12.1</span>,</span>
<span id="cb3-10">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"4H Post-dose"</span>,   <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">10.3</span>,</span>
<span id="cb3-11">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"8H Post-dose"</span>,   <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">6.8</span>,</span>
<span id="cb3-12">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"001"</span>,    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"24H Post-dose"</span>,  <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.1</span></span>
<span id="cb3-13">)</span>
<span id="cb3-14"></span>
<span id="cb3-15">adpc_nfrlt <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb3-16">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">derive_var_nfrlt</span>(</span>
<span id="cb3-17">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">new_var =</span> NFRLT,</span>
<span id="cb3-18">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">new_var_unit =</span> FRLTU,</span>
<span id="cb3-19">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">out_unit =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"HOURS"</span>,</span>
<span id="cb3-20">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tpt_var =</span> PCTPT,</span>
<span id="cb3-21">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">visit_day =</span> VISITDY</span>
<span id="cb3-22">  )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 7 × 6
  USUBJID VISITDY PCTPT         PCSTRESN NFRLT FRLTU
  &lt;chr&gt;     &lt;dbl&gt; &lt;chr&gt;            &lt;dbl&gt; &lt;dbl&gt; &lt;chr&gt;
1 001           1 Pre-dose           0     0   HOURS
2 001           1 30M Post-dose      5.2   0.5 HOURS
3 001           1 1H Post-dose       8.4   1   HOURS
4 001           1 2H Post-dose      12.1   2   HOURS
5 001           1 4H Post-dose      10.3   4   HOURS
6 001           1 8H Post-dose       6.8   8   HOURS
7 001           1 24H Post-dose      2.1  24   HOURS</code></pre>
</div>
</div>
<p>The functions can work with any time-point variables from other domains such as <code>LB</code>, <code>VS</code> or ’EG`. There a is also a treatment duration option in the case of infusions and an option for time point ranges such as “4-8H AFTER END OF INFUSION”.</p>
</section>
<section id="deep-dive-3-anti-drug-antibody-template-and-vignette" class="level2">
<h2 class="anchored" data-anchor-id="deep-dive-3-anti-drug-antibody-template-and-vignette">Deep dive 3: Anti-drug-antibody template and vignette</h2>
<p>{admiral} 1.4 introduces a new ADaM template script to aid in creating Anti-drug Antibody Analysis Datasets (<code>ADAB</code>). This template is accompanied by a detailed <a href="https://pharmaverse.github.io/admiral/cran-release/articles/adab.html">vignette</a> that walks you through the process of deriving key variables and implementing analysis strategies specific to anti-drug antibody data, including the use of one of our new experimental functions <code>derive_var_nfrlt()</code>. The template covers common scenarios encountered in immunogenicity assessments, providing a solid foundation for users to build upon and customize according to their study requirements.</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/adab_vignette.png" class="img-fluid"></p>
<p>As usual, to use start using the template you can run:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_ad_template</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"adab"</span>)</span></code></pre></div></div>
</div>
<p>…or you can peruse the template directly from the website from our new <a href="https://pharmaverse.github.io/admiral/cran-release/articles/templates.html">Explore ADaM Templates</a> page.</p>
</section>
</section>
<section id="whats-coming-in-admiral-1.5" class="level1">
<h1>What’s coming in admiral 1.5?</h1>
<p>{admiral} is very much community driven, so please continue reaching out through <a href="https://join.slack.com/t/pharmaverse/shared_invite/zt-yv5atkr4-Np2ytJ6W_QKz_4Olo7Jo9A">Slack</a> or <a href="https://github.com/pharmaverse/admiral/issues">GitHub</a> if you have ideas or requests for enhancements to our package. {admiral} 1.5 is due to release in June 2026, and some current ideas for new content include improved Estimands documentation and ways to enable positive censoring within TTE derivations.</p>
<!--------------- appendices go here ----------------->
<div class="cell">
<div class="cell-output-display">


</div>
</div>


</section>

<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:27.969349</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_admiral_1.4.../admiral_14_release.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{dickinson2026,
  author = {Dickinson, Jeff and Straub, Ben and Mancini, Edoardo},
  title = {Admiral 1.4 Release},
  date = {2026-01-15},
  url = {https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral_14_release.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-dickinson2026" class="csl-entry quarto-appendix-citeas">
Dickinson, Jeff, Ben Straub, and Edoardo Mancini. 2026. <span>“Admiral
1.4 Release.”</span> January 15, 2026. <a href="https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral_14_release.html">https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral_14_release.html</a>.
</div></div></section></div> ]]></description>
  <category>ADaM</category>
  <guid>https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral_14_release.html</guid>
  <pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2026-01-15_admiral_14/admiral.png" medium="image" type="image/png" height="152" width="144"/>
</item>
<item>
  <title>Introducing docorator to the pharmaverse</title>
  <dc:creator>Becca Krouse</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/introducing_docorator.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>Disclaimer: This blog contains opinions that are of the authors alone and do not necessarily reflect the strategy of their respective organizations.</p>
<p>We are pleased to introduce a new addition to the pharmaverse: <code>{docorator}</code>, an R package developed by GSK to facilitate the creation of production displays within pharma workflows. If you’ve ever spent hours perfecting a table or figure, only to wrestle with adding compliant headers, footers, and perfect margins for a polished product, <code>{docorator}</code> might be for you.</p>
<p>For full documentation, visit the website here: <a href="https://gsk-biostatistics.github.io/docorator/">https://gsk-biostatistics.github.io/docorator/</a></p>
<section id="what-is-docorator" class="level2">
<h2 class="anchored" data-anchor-id="what-is-docorator">What is <code>docorator</code>?</h2>
<p>The package name, <code>{docorator}</code>, signifies its core functionality: <strong>decorate</strong> and <strong>output</strong>. The package takes TLGs generated by popular R packages such as <code>{gt}</code> (and by extension <code>{tfrmt}</code> and <code>{gtsummary}</code>) and <code>{ggplot2}</code> and “decorates” them with custom headers, footers, etc. in production-ready outputs.</p>
<p>The <code>{docorator}</code> package is built on a foundation of reproducibility and flexibility through its multi-rendering framework. While the primary and most robust rendering engine is PDF (leveraging Rmarkdown/Quarto and LaTeX internally), basic RTF support is also available, with the underlying framework designed for expansion to other output formats in the future.</p>
</section>
<section id="how-docorator-complements-the-pharmaverse" class="level2">
<h2 class="anchored" data-anchor-id="how-docorator-complements-the-pharmaverse">How <code>docorator</code> complements the pharmaverse</h2>
<p>This package can be considered complementary to the pharmaverse packages <code>{clinify}</code> and <code>{gridify}</code>. It offers an additional option for R users seeking to meet organizational requirements for specific output types, as well as standardized headers, footers, margins, and sizing. A key feature of <code>{docorator}</code> is its PDF support with embedded table values. By rendering to PDF via RMarkdown/Quarto and LaTeX, the displayed values become embedded within the PDF document, which enhance traceability. For <code>{gt}</code> tables specifically, automated table scaling (i.e.&nbsp;column resizing) is applied by default to assist with fitting the display to the available space.</p>
</section>
<section id="example-pdf-render" class="level2">
<h2 class="anchored" data-anchor-id="example-pdf-render">Example: PDF render</h2>
<p>The process of rendering a display involves two main steps:</p>
<ol type="1">
<li><p><strong>Create a <code>docorator</code> object:</strong> This step uses the <code>as_docorator()</code> function to add headers, footers, and other styling elements.</p></li>
<li><p><strong>Render an output</strong>: A simple function call generates the final document.</p></li>
</ol>
<p>Below is an illustrative example:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># This code assumes a display object called `t_demog` has been created</span></span>
<span id="cb1-2">t_demog <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as_docorator</span>(</span>
<span id="cb1-4">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">display_name =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"t_demog"</span>,</span>
<span id="cb1-5">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">display_loc =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"path/to/output/folder"</span>,</span>
<span id="cb1-6">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">header =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyhead</span>(</span>
<span id="cb1-7">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Study ABC123"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">center =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">doc_pagenum</span>()),</span>
<span id="cb1-8">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Safety Population"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">center =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>),</span>
<span id="cb1-9">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">center =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Demographic Summary"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>)</span>
<span id="cb1-10">    ),</span>
<span id="cb1-11">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">footer =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyfoot</span>(</span>
<span id="cb1-12">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"path/to/t_demog.R"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">doc_datetime</span>())</span>
<span id="cb1-13">    )</span>
<span id="cb1-14">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-15">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">render_pdf</span>()</span></code></pre></div></div>
<p>Note that headers and footers are specified via the <code>header</code> and <code>footer</code> arguments using the <code>fancyhead()</code> and <code>fancyfoot()</code> functions, respectively. These functions, inspired by (and for PDF, powered by) the <a href="https://ctan.mirrors.hoobly.com/macros/latex/contrib/fancyhdr/fancyhdr.pdf"><code>fancyhdr</code></a> LaTeX library, allow users to flexibly add multiple rows of headers and/or footers with left, center, and/or right aligned text. Rows of headers/footers are added via the <code>fancyrow()</code> function which has arguments for where the custom text should be added.</p>
<p>Here’s the result:</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/demog_tbl.png" class="img-fluid" alt="Demographic table">.</p>
</section>
<section id="example-multiple-renders" class="level2">
<h2 class="anchored" data-anchor-id="example-multiple-renders">Example: multiple renders</h2>
<p>In pharma, it’s very common for displays to be utilized across multiple reports, presentations, and various downstream systems. <code>{docorator}</code> is engineered for reuse, offering several powerful features:</p>
<ol type="1">
<li><strong>Multi-render capability:</strong> Users can render to multiple output types using pipeable syntax.</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Continuing from the previous example:</span></span>
<span id="cb2-2">t_demog <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as_docorator</span>(</span>
<span id="cb2-4">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">display_name =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"t_demog"</span>,</span>
<span id="cb2-5">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">display_loc =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"path/to/output/folder"</span>,</span>
<span id="cb2-6">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">header =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyhead</span>(</span>
<span id="cb2-7">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Study ABC123"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">center =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">doc_pagenum</span>()),</span>
<span id="cb2-8">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Safety Population"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">center =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>),</span>
<span id="cb2-9">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">center =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Demographic Summary"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>)</span>
<span id="cb2-10">    ),</span>
<span id="cb2-11">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">footer =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyfoot</span>(</span>
<span id="cb2-12">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fancyrow</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">left =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"path/to/t_demog.R"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">right =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">doc_datetime</span>())</span>
<span id="cb2-13">    )</span>
<span id="cb2-14">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-15">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">render_pdf</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-16">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">render_rtf</span>() <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># This will generate both PDF and RTF outputs</span></span></code></pre></div></div>
<ol start="2" type="1">
<li><strong>The <code>docorator</code> object artifact:</strong></li>
</ol>
<p>Executing <code>as_docorator()</code> does not immediately render your display. Instead, it creates a <code>docorator</code> object that stores all relevant display information in an <code>.rds</code> file. This object serves as an artifact for future rendering or other downstream requirements. For the above example, <code>t_demog.rds</code> will be saved in the folder “path/to/output/folder” alongside the “t_demog.pdf” and “t_demog.rtf” output documents.</p>
</section>
<section id="a-note-on-latex-dependencies" class="level2">
<h2 class="anchored" data-anchor-id="a-note-on-latex-dependencies">A note on LaTeX dependencies</h2>
<p>As noted in its README, <code>{docorator}</code> requires a LaTeX installation for PDF rendering. If using <code>{tinytex}</code>, the <code>TinyTeX</code> bundle is recommended, which can be installed via the following code:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1">tinytex<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install_tinytex</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">bundle =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TinyTeX"</span>)</span></code></pre></div></div>
</section>
<section id="get-in-touch" class="level2">
<h2 class="anchored" data-anchor-id="get-in-touch">Get in touch!</h2>
<p>We encourage you to try <code>{docorator}</code> and provide any suggestions or report problems via the GitHub <a href="https://github.com/GSK-Biostatistics/docorator/issues">issues</a>.</p>


</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{krouse2025,
  author = {Krouse, Becca},
  title = {Introducing Docorator to the Pharmaverse},
  date = {2025-12-19},
  url = {https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/introducing_docorator.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-krouse2025" class="csl-entry quarto-appendix-citeas">
Krouse, Becca. 2025. <span>“Introducing Docorator to the
Pharmaverse.”</span> December 19, 2025. <a href="https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/introducing_docorator.html">https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/introducing_docorator.html</a>.
</div></div></section></div> ]]></description>
  <category>TLG</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/introducing_docorator.html</guid>
  <pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-12-19_introducing/docorator_hex.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>Explore the Pharmaverse Examples: Your Gateway to Clinical Reporting with Open-Source Tools</title>
  <dc:creator>Orla Doyle and Ross Farrugia</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse__examples.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="pharmaverse-examples-highlights" class="level3">
<h3 class="anchored" data-anchor-id="pharmaverse-examples-highlights">🔍 Pharmaverse Examples Highlights</h3>
<p>If you’re navigating the world of clinical reporting with modern tooling or are curious about open-source tooling then the <a href="https://pharmaverse.github.io/examples/">pharmaverse examples site</a> is your one-stop-shop! This <strong>living collection</strong> of end-to-end examples showcases how open-source packages from the pharmaverse ecosystem work together to solve real clinical reporting challenges.</p>
<p>The site is organized into easy-to-navigate sections:</p>
<ul>
<li><p><strong>SDTM</strong> examples like DM (Demographics), VS (Vital Signs), AE (Adverse Events).</p></li>
<li><p><strong>ADaM</strong> examples including ADSL (Subject Level), ADTTE (Time-to-Event) and ADVS (Vital Signs).</p></li>
<li><p><strong>TLG</strong> examples showing how to build demographic tables, adverse event summaries, and pharmacokinetic displays.</p></li>
<li><p><strong>Interactive</strong> content such as data visualization apps built with teal.</p></li>
<li><p><strong>Automated reporting</strong> of outputs via slides or docs.</p></li>
<li><p><strong>eSubmission</strong> for submission preparation.</p></li>
<li><p><strong>and so much more!</strong> - visit the site to see all the latest articles!</p></li>
</ul>
<p>You can check out Pharmaverse examples in a bunch of different ways, and also offering translation in different spoken languages!</p>
<ol type="1">
<li><p>You can follow the examples step-by-step reading the code snippets and tracing the evolution of a set of representative data from end to end.</p></li>
<li><p>You can use our interactive setup using <a href="https://pharmaverse.github.io/examples/#posit-cloud">posit cloud</a> that takes care of any environment set up allowing you to jump straight into exploration.</p></li>
</ol>
</section>
<section id="why-it-matters" class="level3">
<h3 class="anchored" data-anchor-id="why-it-matters">💬 Why It Matters</h3>
<p>Open source thrives on collaboration, and the pharmaverse ecosystem embodies this by <strong>bringing developers and users together</strong> to share tools, workflows, and best practices. The Examples site is a bridge between learning and doing that helps guide users:</p>
<ul>
<li><p>Understand how packages fit together</p></li>
<li><p>Forum to share how packages are used by different teams</p></li>
<li><p>Work towards reproducible, end to end workflows</p></li>
</ul>
<p>All of this contributes to <strong>faster, more reliable clinical reporting</strong> and supports the broader mission of shared problem solved across the industry.</p>
</section>
<section id="how-you-can-contribute" class="level3">
<h3 class="anchored" data-anchor-id="how-you-can-contribute">🤝 How You Can Contribute</h3>
<p>The pharmaverse examples site is a <strong>community-driven site</strong> that grows with contributions from developers and practitioners.</p>
<p>Here’s how you can get involved:</p>
<section id="contribute-an-example" class="level4">
<h4 class="anchored" data-anchor-id="contribute-an-example">📌 1. <strong>Contribute an Example</strong></h4>
<p>Have a example that others might benefit from? Add a new example by contributing via the <a href="https://github.com/pharmaverse/examples">GitHub repo</a>. The source code includes guidance in the README about how to structure and submit contributions.</p>
<p>Alternatively, if you have identified an example that you’d like to see added then please add an <a href="https://github.com/pharmaverse/examples/issues">issue</a></p>
</section>
<section id="improve-existing-content" class="level4">
<h4 class="anchored" data-anchor-id="improve-existing-content">🛠 2. <strong>Improve Existing Content</strong></h4>
<p>All contributions are welcomed no matter how big or small. Please feel free to suggest edits to our supporting docs and code snippets either via creating an <a href="https://github.com/pharmaverse/examples/issues">issue</a> and / or making the suggested changes via a <a href="https://github.com/pharmaverse/examples">pull request</a>.</p>
</section>
<section id="engage-with-the-community" class="level4">
<h4 class="anchored" data-anchor-id="engage-with-the-community">💬 3. <strong>Engage With the Community</strong></h4>
<p>Who we are: the examples site is curated by a subteam from pharmaverse who work across the industry and are passionate about developing, iterating and sharing open-source tools across pharma.</p>
<p>Join the pharmaverse community on <a href="https://pharmaverse.slack.com/">Slack</a> participate in discussions, and help others get up to speed. Contributions such as feedback, guidance, and engaging your teams with these examples are equally valuable.</p>
<p>✨ Wrapping up: whether you’re just starting with pharmaverse packages or looking to deepen your practice, we hope the pharmaverse examples site provides you with valuable content to explore.</p>
<p>Start exploring today, and maybe even contribute your first example!</p>
<p>👉 https://pharmaverse.github.io/examples/</p>
<!--------------- appendices go here ----------------->
</section>
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:45.668499</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_pharmaverse.../pharmaverse__examples.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{doyle_and_ross_farrugia2025,
  author = {Doyle and Ross Farrugia, Orla},
  title = {Explore the {Pharmaverse} {Examples:} {Your} {Gateway} to
    {Clinical} {Reporting} with {Open-Source} {Tools}},
  date = {2025-12-18},
  url = {https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse__examples.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-doyle_and_ross_farrugia2025" class="csl-entry quarto-appendix-citeas">
Doyle and Ross Farrugia, Orla. 2025. <span>“Explore the Pharmaverse
Examples: Your Gateway to Clinical Reporting with Open-Source
Tools.”</span> December 18, 2025. <a href="https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse__examples.html">https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse__examples.html</a>.
</div></div></section></div> ]]></description>
  <category>Submissions</category>
  <category>Technical</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse__examples.html</guid>
  <pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-12-18_pharmaverse/pharmaverse_examples.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>New Council Members</title>
  <dc:creator>Ross Farrugia</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/new__council__members.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>Hi pharmaverse community,</p>
<p>On behalf of the council we wanted to update you on 2 council members who are passing on the baton to new representatives from their respective companies.</p>
<p>Firstly, Michael Rimler (who is one of our original co-founders) will transition council responsibilities for GSK to Alice Ehmann. Michael will never be too far away though, as he maintains his role on the PHUSE board as Open Source Technologies Director. His passion, creativity and ambition were one of the key reasons we have such a thriving pharmaverse suite of open source solutions and the community we see today.</p>
<p>Alice Ehmann joins having previously being a package lead and contributor for <code>{admiral}</code> and as a long term R and open source enthusiast.</p>
<p>Secondly, Damian Rodziewicz is handing over the Appsilon council representative role to Marcin Dubel. Damian has brought such enthusiasm to our council during his term and has helped us to expand our outreach. We’ll miss his level-headed and pragmatic style, and how he always championed the everyday users of pharmaverse packages.</p>
<p>Marcin is the Head of Technology at Appsilon, so will bring extra technical skill depth to the council and will continue in Damian’s great example.</p>
<p>Please join us in thanking Michael and Damian for all they’ve done for our community, and welcome to Alice and Marcin! You’ll find photos and bios for our new council members below.</p>
<p>If you ever want to know more about our council please check our <a href="https://pharmaverse.org/contribute/council/">site page</a>, and you can reach all of us using: pharmaverse.council@phuse.global.</p>
<p><strong>Bios:</strong></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/AliceEhmann.jpeg" class="img-fluid figure-img"></p>
<figcaption>Alice Ehmann</figcaption>
</figure>
</div>
<p>Alice Ehmann is an accomplished programming leader with over 25 years experience in various roles within the pharmaceutical industry. She joined GSK in 2019 and is currently an Associate Director of programming within the clinical programming group.</p>
<p>She has helped to drive R adoption from its inception at GSK, while also pioneering the use of agile methodologies in programming workflows. As an early R adopter, she played a key role in the early collaboration with Roche and GSK on the development of the <code>{admiral}</code> package. She is now focused on integrating AI into R workflows and modernizing programming processes in R.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/MarcinDubel.png" class="img-fluid figure-img"></p>
<figcaption>Marcin Dubel</figcaption>
</figure>
</div>
<p>Marcin Dubel is a seasoned R Shiny developer with a career dating back to 2015. He has crafted applications for diverse sectors such as finance, pharmaceuticals, logistics and entertainment, tailoring solutions to meet industry-specific challenges. Marcin is the Head of Technology at Appsilon, where he has been since 2019.</p>
<p>He drives project quality and innovation, making sure all Appsilon projects meet their high-standard criteria. His responsibilities include leading AI projects and championing the adoption of language model technologies within the company. Marcin holds a master’s degree in data science and finance.</p>
<!--------------- appendices go here ----------------->
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:32:31.275116</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_new__counci.../new__council__members.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{farrugia2025,
  author = {Farrugia, Ross},
  title = {New {Council} {Members}},
  date = {2025-10-31},
  url = {https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/new__council__members.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-farrugia2025" class="csl-entry quarto-appendix-citeas">
Farrugia, Ross. 2025. <span>“New Council Members.”</span> October 31,
2025. <a href="https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/new__council__members.html">https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/new__council__members.html</a>.
</div></div></section></div> ]]></description>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/new__council__members.html</guid>
  <pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-10-31_new__counci/pharmaverse.png" medium="image" type="image/png" height="128" width="144"/>
</item>
<item>
  <title>Introducing admiralneuro!</title>
  <dc:creator>Miles Almond</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-09-15-introducing/introducing_admiralneuro.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="introduction" class="level1">
<h1>Introduction</h1>
<p><code>{admiralneuro}</code> joins the family as the latest <code>{admiral}</code> extension package. The package supports neurological disease areas, with the initial release of version 0.1.0 focusing on Alzheimer’s disease.</p>
<p>The package was born out of a collaboration between Eli Lilly, Roche, Cytel, GSK, and contributors from the wider industry. The package maintainer is Jian Wang (Eli Lilly).</p>
</section>
<section id="package-contents" class="level1">
<h1>Package Contents</h1>
<p>In the 0.1.0 release, <code>{admiralneuro}</code> provides the following:</p>
<ul>
<li>Alzheimer’s-specific SDTM test data - this will be moved to <code>{pharmaversesdtm}</code> for the 0.2.0 release of <code>{admiralneuro}</code>
<ul>
<li><a href="https://github.com/pharmaverse/pharmaversesdtm/blob/main/data-raw/dm_neuro.R">DM</a> - Demographics dataset including age-appropriate Alzheimer’s patients</li>
<li><a href="https://github.com/pharmaverse/pharmaversesdtm/blob/main/data-raw/nv_neuro.R">NV</a> - Neurological exams dataset including amyloid and tau PET scans at baseline and two follow-up visits</li>
<li><a href="https://github.com/pharmaverse/pharmaversesdtm/blob/main/data-raw/suppnv_neuro.R">SUPPNV</a>- Supplemental neurological exams dataset including reference regions used for SUVR calculations</li>
<li><a href="https://github.com/pharmaverse/pharmaversesdtm/blob/main/data-raw/ag_neuro.R">AG</a> - Agents dataset including tracer details for amyloid and tau PET scans</li>
</ul></li>
<li>A brand-new function admiralneuro::compute_centiloid() that computes Centiloid values based on amyloid PET tracer, SUVR pipeline, and reference region</li>
<li>Two template programs for <a href="https://github.com/pharmaverse/admiralneuro/blob/main/inst/templates/ad_adapet.R">ADAPET</a> and <a href="https://github.com/pharmaverse/admiralneuro/blob/main/inst/templates/ad_adtpet.R">ADTPET</a></li>
<li>A corresponding <a href="https://pharmaverse.github.io/admiralneuro/articles/adpet.html">Creating ADTPET and ADAPET Vignette</a></li>
</ul>
<section id="compute_centiloid" class="level3">
<h3 class="anchored" data-anchor-id="compute_centiloid"><code>compute_centiloid()</code></h3>
<p>The Centiloid scale is a standardized quantitative measure for amyloid PET imaging that allows comparison between different tracers and analysis methods. It is calculated as:</p>
<p><img src="https://latex.codecogs.com/png.latex?Centiloid%20=%20slope*SUVR%20+%20intercept"></p>
<p>where SUVR is a patient’s Standardized Uptake Value Ratio.</p>
<p>The admiralneuro::compute_centiloid() function neatly computes Centiloid values from SUVR values given a specific combination of tracer, SUVR pipeline, and reference region in order to define slope and intercept. Currently, the following combinations of <strong>tracer</strong>, <strong>pipeline</strong>, and <strong>ref_region</strong> are supported:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<tbody>
<tr class="odd">
<td>tracer</td>
<td>pipeline</td>
<td>ref_region</td>
<td>slope</td>
<td>intercept</td>
</tr>
<tr class="even">
<td>18F-Florbetapir</td>
<td>AVID FBP SUVR PIPELINE</td>
<td>Whole Cerebellum</td>
<td>183.07</td>
<td>-177.26</td>
</tr>
<tr class="odd">
<td>18F-Florbetaben</td>
<td>AVID FBB SUVR PIPELINE</td>
<td>Whole Cerebellum</td>
<td>156.06</td>
<td>-148.13</td>
</tr>
<tr class="even">
<td>18F-Florbetapir</td>
<td>BERKELEY FBP SUVR PIPELINE</td>
<td>Whole Cerebellum</td>
<td>188.22</td>
<td>-189.16</td>
</tr>
<tr class="odd">
<td>18F-Florbetaben</td>
<td>BERKELEY FBB SUVR PIPELINE</td>
<td>Whole Cerebellum</td>
<td>157.15</td>
<td>-151.87</td>
</tr>
</tbody>
</table>
<p><br>
Here is an example of the function in action:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(admiral)</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(admiralneuro)</span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dplyr)</span>
<span id="cb1-4"></span>
<span id="cb1-5">adapet_example <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> admiralneuro<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span>admiralneuro_adapet <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-6">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(PARAMCD <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUVRBFBB"</span>)</span>
<span id="cb1-7"></span>
<span id="cb1-8">adapet_example <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> adapet_example <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-9">  admiral<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">derive_param_computed</span>(</span>
<span id="cb1-10">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">by_vars =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb1-11">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">get_admiral_option</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"subject_keys"</span>),</span>
<span id="cb1-12">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">exprs</span>(ADT, ADY, VISIT)</span>
<span id="cb1-13">    ),</span>
<span id="cb1-14">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">parameters =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUVRBFBB"</span>),</span>
<span id="cb1-15">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">set_values_to =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">exprs</span>(</span>
<span id="cb1-16">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">AVAL =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">compute_centiloid</span>(</span>
<span id="cb1-17">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tracer =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"18F-Florbetaben"</span>,</span>
<span id="cb1-18">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pipeline =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BERKELEY FBB SUVR PIPELINE"</span>,</span>
<span id="cb1-19">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ref_region =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Whole Cerebellum"</span>,</span>
<span id="cb1-20">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">suvr =</span> AVAL</span>
<span id="cb1-21">      ),</span>
<span id="cb1-22">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PARAMCD =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CENTLD"</span>,</span>
<span id="cb1-23">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PARAM =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Centiloid value derived from SUVR pipeline"</span>,</span>
<span id="cb1-24">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">AVALU =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CL"</span></span>
<span id="cb1-25">    )</span>
<span id="cb1-26">  )</span></code></pre></div></div>
</div>
<div class="cell">
<div class="cell-output-display">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 13%">
<col style="width: 9%">
<col style="width: 49%">
<col style="width: 10%">
<col style="width: 10%">
<col style="width: 6%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">USUBJID</th>
<th style="text-align: left;">PARAMCD</th>
<th style="text-align: left;">PARAM</th>
<th style="text-align: left;">VISIT</th>
<th style="text-align: right;">AVAL</th>
<th style="text-align: left;">AVALU</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">01-701-1345</td>
<td style="text-align: left;">CENTLD</td>
<td style="text-align: left;">Centiloid value derived from SUVR pipeline</td>
<td style="text-align: left;">BASELINE</td>
<td style="text-align: right;">186.0025</td>
<td style="text-align: left;">CL</td>
</tr>
<tr class="even">
<td style="text-align: left;">01-701-1345</td>
<td style="text-align: left;">CENTLD</td>
<td style="text-align: left;">Centiloid value derived from SUVR pipeline</td>
<td style="text-align: left;">WEEK 12</td>
<td style="text-align: right;">206.2748</td>
<td style="text-align: left;">CL</td>
</tr>
<tr class="odd">
<td style="text-align: left;">01-701-1360</td>
<td style="text-align: left;">CENTLD</td>
<td style="text-align: left;">Centiloid value derived from SUVR pipeline</td>
<td style="text-align: left;">BASELINE</td>
<td style="text-align: right;">164.6301</td>
<td style="text-align: left;">CL</td>
</tr>
<tr class="even">
<td style="text-align: left;">01-714-1288</td>
<td style="text-align: left;">CENTLD</td>
<td style="text-align: left;">Centiloid value derived from SUVR pipeline</td>
<td style="text-align: left;">BASELINE</td>
<td style="text-align: right;">130.6857</td>
<td style="text-align: left;">CL</td>
</tr>
<tr class="odd">
<td style="text-align: left;">01-714-1288</td>
<td style="text-align: left;">CENTLD</td>
<td style="text-align: left;">Centiloid value derived from SUVR pipeline</td>
<td style="text-align: left;">WEEK 12</td>
<td style="text-align: right;">150.9580</td>
<td style="text-align: left;">CL</td>
</tr>
<tr class="even">
<td style="text-align: left;">01-714-1288</td>
<td style="text-align: left;">CENTLD</td>
<td style="text-align: left;">Centiloid value derived from SUVR pipeline</td>
<td style="text-align: left;">WEEK 26</td>
<td style="text-align: right;">191.6599</td>
<td style="text-align: left;">CL</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><br>
Alternatively, the user can specify a custom slope and intercept to the function using the <strong>custom_slope</strong> and <strong>custom_intercept</strong> parameters.</p>
<p>Note that support for additional combinations of tracers, pipelines, and reference regions may be added in the future as needed. See <a href="https://doi.org/10.1016/j.nicl.2025.103765">Iaccarino, L. et al., 2025</a> for more Centiloid transformation formulas.</p>
</section>
<section id="templates-and-vignette" class="level3">
<h3 class="anchored" data-anchor-id="templates-and-vignette">Templates and Vignette</h3>
<p>The <code>{admiralneuro}</code> package website contains the <a href="https://pharmaverse.github.io/admiralneuro/articles/adpet.html">Creating ADTPET and ADAPET Vignette</a> which guides users through the creation of both ADTPET (Tau PET) and ADAPET (Amyloid PET) ADaM datasets. This covers the use of the admiralneuro::compute_centiloid() function above, as well as other therapeutic area-specific considerations for these BDS datasets such as derivation of criterion flag variables for Centiloid categories.</p>
<p>The vignette accompanies the ADTPET and ADAPET template scripts, which can be used as a starting point for creating these ADaM datasets. These scripts can be loaded and saved directly from the R console by running either of the following:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_ad_template</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ADTPET"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">package =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"admiralneuro"</span>)</span></code></pre></div></div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_ad_template</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ADAPET"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">package =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"admiralneuro"</span>)</span></code></pre></div></div>
</div>
</section>
</section>
<section id="conclusion" class="level1">
<h1>Conclusion</h1>
<p>We’re excited to share the first release of <code>{admiralneuro}</code>, and we hope it will be a valuable resource for those working in the Alzheimer’s disease space. We look forward to expanding the package in future releases to include alpha-synuclein pathology, a hallmark of Parkinson’s disease that is also found in other neurodegenerative conditions, including Alzheimer’s disease. We’ll also be adding functions to explore olfactory impairment, a fascinating early signal connected to both Parkinson’s disease and Alzheimer’s disease.</p>
<p>As with all pharmaverse packages, community feedback is not only welcomed but encouraged so that development remains in a direction that is relevant and useful! Please raise your feedback as issues or discussions in our <a href="https://github.com/pharmaverse/admiralneuro">GitHub repository</a> or the <a href="https://join.slack.com/t/pharmaverse/shared_invite/zt-yv5atkr4-Np2ytJ6W_QKz_4Olo7Jo9A">pharmaverse slack</a>.</p>
<!--------------- appendices go here ----------------->
<div class="cell">
<div class="cell-output-display">


</div>
</div>


</section>

<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:13.155737</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_introducing.../introducing_admiralneuro.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{almond2025,
  author = {Almond, Miles},
  title = {Introducing Admiralneuro!},
  date = {2025-09-15},
  url = {https://pharmaverse.github.io/blog/posts/2025-09-15-introducing/introducing_admiralneuro.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-almond2025" class="csl-entry quarto-appendix-citeas">
Almond, Miles. 2025. <span>“Introducing Admiralneuro!”</span> September
15, 2025. <a href="https://pharmaverse.github.io/blog/posts/2025-09-15-introducing/introducing_admiralneuro.html">https://pharmaverse.github.io/blog/posts/2025-09-15-introducing/introducing_admiralneuro.html</a>.
</div></div></section></div> ]]></description>
  <category>ADaM</category>
  <category>Community</category>
  <category>Technical</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-09-15-introducing/introducing_admiralneuro.html</guid>
  <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-09-15-introducing/admiralneuro.png" medium="image" type="image/png" height="130" width="144"/>
</item>
<item>
  <title>Faster Clinical Trial Reporting: A Beginner’s Guide to Implementing CDISC SDTM and ADaM Standards with Open-Source R Packages</title>
  <dc:creator>Fabian Hee</dc:creator>
  <dc:creator>Alexandros Kouretsis</dc:creator>
  <dc:creator>APPSILON </dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/faster_clinical_trial_reporting.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>Clinical trials are a crucial component of the pharmaceutical industry, providing the evidence needed to demonstrate the safety, efficacy, and overall benefit of new drugs or treatments.</p>
<p>Clinical trials reporting, a detailed process in itself, is guided by regulatory agencies like the U.S. Food and Drug Administration (FDA), the European Medicines Agency (EMA), and the International Conference on Harmonisation (ICH).</p>
<p>The results of these trials must be carefully reported to protect public health and foster trust in the pharmaceutical industry. Pharmaverse and R directly support this need by providing open-source, transparent, and standardized tools that enable consistent data handling and reporting.</p>
<section id="current-challenges" class="level2">
<h2 class="anchored" data-anchor-id="current-challenges">Current challenges</h2>
<p>Clinical trials face several challenges in their current state, which can be broadly categorized into three key areas:</p>
<section id="ethical-and-transparency-issues" class="level3">
<h3 class="anchored" data-anchor-id="ethical-and-transparency-issues">Ethical and Transparency Issues</h3>
<p>International ethical standards, including the <a href="https://www.wma.net/policies-post/wma-declaration-of-helsinki-ethical-principles-for-medical-research-involving-human-subjects/">Declaration of Helsinki</a>, emphasize that the results of all clinical trials—whether positive, negative, or inconclusive—should be made publicly accessible. Nevertheless, empirical studies show that compliance remains inconsistent. In particular, early-phase or smaller studies, as well as trials with negative outcomes, are less likely to be reported in a timely or visible manner (<a href="https://www.socra.org/blog/clinicaltrials-registration-results-reporting/">SOCRA</a>; <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC4508873/">BMJ/PMC analysis</a>). Furthermore, evidence suggests that industry sponsorship can introduce bias at various stages of trial design, analysis, and reporting, which reinforces the importance of transparent dissemination of all findings (<a href="https://pubmed.ncbi.nlm.nih.gov/28207928/">Cochrane review, 2017</a>).</p>
</section>
<section id="cost-and-efficiency-challenges" class="level3">
<h3 class="anchored" data-anchor-id="cost-and-efficiency-challenges">Cost and Efficiency Challenges</h3>
<p>Clinical trials are expensive, often exceeding hundreds of millions of dollars, and this can inhibit the development of drugs for rare diseases where the return on investment is limited by the small size of the patient population. Failure in clinical trials – especially in late phase trials that often include upwards of 1000 patients – can incur huge losses, compounded by the complex and varying nature of global regulations around them.</p>
</section>
<section id="data-and-reproducibility-concerns" class="level3">
<h3 class="anchored" data-anchor-id="data-and-reproducibility-concerns">Data and Reproducibility Concerns</h3>
<p>Reproducibility is key for independent verification of clinical trial results. Differences in data collection methods, formats, and methodologies often hinder cross-study comparisons, especially if a study was not designed with international standards that are consistent and reproducible.</p>
</section>
</section>
<section id="pharmaceutical-standards" class="level2">
<h2 class="anchored" data-anchor-id="pharmaceutical-standards">Pharmaceutical Standards</h2>
<p>The <a href="https://www.cdisc.org/"><strong>Clinical Data Interchange Standards Consortium (CDISC)</strong></a> provides globally accepted data standards, which are a set of guidelines and models used to standardize the collection, exchange, and analysis of clinical trial data. These standards aim to improve efficiency, data quality, and interoperability across various clinical research areas.</p>
<p>In this article specifically, the key CDISC Standards we are going to highlight are Clinical Data Acquisition Standards Harmonization (CDASH), Study Data Tabulation Model (SDTM) and Analysis Data Model (ADaM).</p>
<section id="cdash---clinical-data-acquisition-standards-harmonization" class="level3">
<h3 class="anchored" data-anchor-id="cdash---clinical-data-acquisition-standards-harmonization">CDASH - Clinical Data Acquisition Standards Harmonization</h3>
<p><a href="https://www.cdisc.org/standards/foundational/cdash">CDASH</a> provides <strong><em>guidelines for standardized data collection</em></strong> across clinical trial studies. It ensures that data collected at clinical sites is structured, consistent, and easily translatable into regulatory submission formats like SDTM.</p>
</section>
<section id="sdtm---study-data-tabulation-model" class="level3">
<h3 class="anchored" data-anchor-id="sdtm---study-data-tabulation-model">SDTM - Study Data Tabulation Model</h3>
<p><a href="https://www.cdisc.org/standards/foundational/sdtmig">SDTM Implementation Guide</a> is a standard for <strong>structuring and organizing clinical study datasets</strong> for regulatory submissions (e.g., to the FDA, EMA). SDTM data is generally treated by the FDA as the <strong>raw or source data</strong>, since it represents the collected study information in a standardized format.</p>
<p>Importantly, SDTM <strong>restructures the collected data</strong> for consistency and transparency across studies, but it does <strong>not derive or create new analysis variables</strong> — that role is covered by ADaM.</p>
</section>
<section id="adam---analysis-data-model" class="level3">
<h3 class="anchored" data-anchor-id="adam---analysis-data-model">ADaM - Analysis Data Model</h3>
<p><a href="https://www.cdisc.org/standards/foundational/adam">ADaM Implementation Guide</a> ensures traceability from SDTM data to analysis-ready datasets. This model establishes a <strong><em>standardized way to create datasets for statistical analysis</em></strong> from SDTM organized data, facilitating efficient analysis and reporting.</p>
</section>
</section>
<section id="the-role-of-r-in-clinical-trials" class="level2">
<h2 class="anchored" data-anchor-id="the-role-of-r-in-clinical-trials">The Role of R in Clinical Trials</h2>
<p>Nowadays, R is widely used in clinical trial analysis due to its flexibility, powerful statistical capabilities, and strong support for regulatory compliance. R provides:</p>
<ul>
<li><strong>Robust Statistical Analysis</strong> used for survival analysis, mixed models, and Bayesian statistics.</li>
<li><strong>Data Cleaning &amp; Transformation</strong> facilitated by specialized packages and modeling tools.</li>
<li><strong>Reproducibility &amp; Open Source Solutions</strong> to ensure that clinical reports and submissions can be automated, reducing errors.</li>
<li><strong>Integration with CDISC Standards</strong> with the help of various R packages that can structure data according to SDTM and ADaM requirements.</li>
</ul>
</section>
<section id="pharmaverse" class="level2">
<h2 class="anchored" data-anchor-id="pharmaverse">Pharmaverse</h2>
<p>Pharmaverse is a collaborative open-source ecosystem of tools for clinical trial data processing and regulatory compliance, currently consisting mainly of R packages but now also including emerging Python software. It provides resources that streamline the implementation of CDISC standards such as SDTM, ADaM, and Define-XML.</p>
<ul>
<li>Key Pharmaverse Packages:
<ul>
<li><strong><code>{sdtm.oak}</code></strong> – Helps in structuring SDTM datasets.</li>
<li><strong><code>{admiral}</code></strong> – Facilitates ADaM dataset creation.</li>
<li><strong><code>{teal}</code></strong> – Builds interactive R/Shiny dashboards for exploratory clinical data analysis.</li>
</ul></li>
<li>Related R Packages:
<ul>
<li><strong><code>{rtables}</code></strong> – Creates regulatory-compliant tables for clinical reports.</li>
<li><strong><code>{tern}</code></strong> – Creates regulatory-compliant tables/graphs for clinical reports.</li>
</ul></li>
</ul>
<p>These are not the only packages that are used, but these are the ones that will be referenced within this blogpost.</p>
<p>Pharmaverse doesn’t have a dedicated CDASH package, but its metadata-driven approach means you can still work with CDASH concepts to connect source data collection to SDTM mapping.</p>
<p>A more comprehensive list of packages can be found here: <a href="https://pharmaverse.org/e2eclinical/" class="uri">https://pharmaverse.org/e2eclinical/</a></p>
</section>
<section id="data-pipeline" class="level2">
<h2 class="anchored" data-anchor-id="data-pipeline">Data Pipeline</h2>
<p>In Clinical Trial Reporting, the data pipeline could follow this standard:</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/images/1.png" class="img-fluid"></p>
<p>The raw data from patients is collected according to CDASH guidelines, then processed with SDTM and ADaM standards to produce related Tables, Listings, and Graphs/Figures outputs that correspond to all aspects of a specific clinical trial.</p>
<p>Starting with the <a href="https://www.cdisc.org/kb/ecrf">CDASH data</a> from a study, the preparation process starts with <code>{sdtm.oak}</code> and <code>{sdtmchecks}</code> packages from the Pharmaverse in order to get them ready for SDTM formatted datasets.</p>
<p>Subsequently, ADaM standards are applied on this data using the <code>{admiral}</code> package, which can then be analysed and transformed into Tables, Listings, and Graphs/Figures using non-pharmaverse (but still related) packages such as <code>{rtables}</code> and <code>{tern}</code>.</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/images/2.png" class="img-fluid"></p>
<p>The Pharmaverse contains some repositories with test data that can help visualize and make sense of this, namely <a href="https://pharmaverse.github.io/pharmaversesdtm/"><code>pharmaversesdtm</code></a> and <a href="https://pharmaverse.github.io/pharmaverseadam/"><code>pharmaverseadam</code></a>.</p>
<p>There is also the <a href="https://insightsengineering.github.io/random.cdisc.data/main/"><code>{random.cdisc.data}</code></a> package that can be used to generate randomized CDISC data for exploratory purposes.</p>
<p>More information about these datasets can be found in their respective documentation sites.</p>
</section>
<section id="tables-listings-graphsfigures" class="level2">
<h2 class="anchored" data-anchor-id="tables-listings-graphsfigures">Tables, Listings, Graphs/Figures</h2>
<p>The content of clinical trial reports contains 3 different types of outputs:</p>
<ol type="1">
<li>Tables</li>
<li>Listings</li>
<li>Graphs/Figures</li>
</ol>
<p>These outputs play a vital part to summarize the results of a clinical trial during reporting. They can summarize safety, efficacy, and exploratory outcomes (such as biomarker analyses).</p>
<p>In the next sections, we will be using the datasets in the <code>{random.cdisc.data}</code> package to help create example outputs used in clinical trials reports. These will be split into two sections each, namely “Data Setup” and “Standard Output Generation”.</p>
<section id="tables" class="level3">
<h3 class="anchored" data-anchor-id="tables">Tables</h3>
<p>In this example, we will be creating a <strong><em>Standard Adverse Events Table (AET02)</em></strong> using the <code>cadsl</code> and <code>cadae</code> datasets from the <code>random.cdisc.data</code> package (see the <a href="https://insightsengineering.github.io/tlg-catalog/">TLG Catalogue</a> for reference).</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/images/3.png" class="img-fluid figure-img"></p>
<figcaption>&gt; Adverse Events Table - AET02</figcaption>
</figure>
</div>
<section id="data-setup" class="level4">
<h4 class="anchored" data-anchor-id="data-setup">Data Setup:</h4>
<pre><code>library(random.cdisc.data)
library(dplyr)
library(tern)

# Ensure character variables are converted to factors so that
# empty strings and NAs are explicit missing levels.

adsl &lt;- df_explicit_na(cadsl)
adae &lt;- df_explicit_na(cadae) %&gt;%
  var_relabel(
    AEBODSYS = "MedDRA System Organ Class",
    AEDECOD = "MedDRA Preferred Term"
  ) %&gt;%
  filter(ANL01FL == "Y")

# Define the split function
split_fun &lt;- drop_split_levels</code></pre>
</section>
<section id="aet02-output-generation" class="level4">
<h4 class="anchored" data-anchor-id="aet02-output-generation">AET02 Output Generation:</h4>
<pre><code># Standard Table for AET02 --------------------------------------------------------------
lyt &lt;- basic_table(show_colcounts = TRUE) %&gt;%
  split_cols_by(var = "ACTARM") %&gt;%
  add_overall_col(label = "All Patients") %&gt;%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c(
      unique = "Total number of patients with at least one adverse event",
      nonunique = "Overall total number of events"
    )
  ) %&gt;%
  split_rows_by(
    "AEBODSYS",
    child_labels = "visible",
    nested = FALSE,
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(adae$AEBODSYS)
  ) %&gt;%
  summarize_num_patients(
    var = "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c(
      unique = "Total number of patients with at least one adverse event",
      nonunique = "Total number of events"
    )
  ) %&gt;%
  count_occurrences(
    vars = "AEDECOD",
    .indent_mods = -1L
  ) %&gt;%
  append_varlabels(adae, "AEDECOD", indent = 1L)

result &lt;- build_table(lyt, df = adae, alt_counts_df = adsl)

result</code></pre>
</section>
</section>
<section id="listings" class="level3">
<h3 class="anchored" data-anchor-id="listings">Listings</h3>
<p>In this example, we will be creating a <strong><em>Standard Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms</em></strong> <strong><em>(AEL01)</em></strong> using the <code>{cadae}</code> dataset from the <code>{random.cdisc.data}</code> package.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/images/4.png" class="img-fluid figure-img"></p>
<figcaption>&gt; Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms - AEL01</figcaption>
</figure>
</div>
<section id="data-setup-1" class="level4">
<h4 class="anchored" data-anchor-id="data-setup-1">Data Setup:</h4>
<pre><code>library(random.cdisc.data)
library(dplyr)
library(rlistings)

out &lt;- cadae %&gt;%
  select(AESOC, AEDECOD, AELLT, AETERM) %&gt;%
  unique()

var_labels(out) &lt;- c(
  AESOC = "MedDRA System Organ Class",
  AEDECOD = "MedDRA Preferred Term",
  AELLT = "MedDRA Lowest Level Term",
  AETERM = "Investigator-Specified\nAdverse Event Term"
)</code></pre>
</section>
<section id="ael01-output-generation" class="level4">
<h4 class="anchored" data-anchor-id="ael01-output-generation">AEL01 Output Generation:</h4>
<pre><code># Standard Listing for AEL01 ------------------------------------------------------------
lsting &lt;- as_listing(
  out,
  key_cols = c("AESOC", "AEDECOD", "AELLT"),
  disp_cols = names(out),
  main_title = "Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms"
)

head(lsting, 20)</code></pre>
</section>
</section>
<section id="graphsfigures" class="level3">
<h3 class="anchored" data-anchor-id="graphsfigures">Graphs/Figures</h3>
<p>In this example, we will be creating a <strong><em>Standard Plot for Subgroup Analysis of Survival Duration (FSTG02)</em></strong> using the <code>{caddtte}</code> dataset from the <code>{random.cdisc.data}</code> package.</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/images/5.png" class="img-fluid" alt="> Subgroup Analysis of Survival Duration - FSTG02"><br>
<em>&gt; Subgroup Analysis of Survival Duration - FSTG02</em></p>
<section id="data-setup-2" class="level4">
<h4 class="anchored" data-anchor-id="data-setup-2">Data Setup:</h4>
<pre><code>library(random.cdisc.data)
library(tern)
library(dplyr)
library(forcats)
library(nestcolor)

preprocess_adtte &lt;- function(adtte) {
  # Save variable labels before data processing steps.
  adtte_labels &lt;- var_labels(adtte)

  adtte &lt;- adtte %&gt;%
    df_explicit_na() %&gt;%
    dplyr::filter(
      PARAMCD == "OS",
      ARM %in% c("B: Placebo", "A: Drug X"),
      SEX %in% c("M", "F")
    ) %&gt;%
    dplyr::mutate(
      # Reorder levels of ARM to display reference arm before treatment arm.
      ARM = droplevels(forcats::fct_relevel(ARM, "B: Placebo")),
      SEX = droplevels(SEX),
      is_event = CNSR == 0,
      # Convert time to MONTH
      AVAL = day2month(AVAL),
      AVALU = "Months"
    ) %&gt;%
    var_relabel(
      ARM = adtte_labels["ARM"],
      SEX = adtte_labels["SEX"],
      is_event = "Event Flag",
      AVAL = adtte_labels["AVAL"],
      AVALU = adtte_labels["AVALU"]
    )

  adtte
}

anl &lt;- cadtte %&gt;%
  preprocess_adtte()</code></pre>
</section>
<section id="fstg02-output-generation" class="level4">
<h4 class="anchored" data-anchor-id="fstg02-output-generation">FSTG02 Output Generation:</h4>
<pre><code># Standard Plot for FSTG02 -------------------------------------------------------
anl1 &lt;- anl

df &lt;- extract_survival_subgroups(
  variables = list(tte = "AVAL", is_event = "is_event", arm = "ARM", subgroups = c("SEX", "BMRKR2")),
  data = anl1
)

result &lt;- basic_table() %&gt;%
  tabulate_survival_subgroups(
    df = df,
    vars = c("n_tot", "n", "median", "hr", "ci"),
    time_unit = anl1$AVALU[1]
  )

result

plot &lt;- g_forest(tbl = result)

plot</code></pre>
</section>
</section>
</section>
<section id="conclusion" class="level2">
<h2 class="anchored" data-anchor-id="conclusion">Conclusion</h2>
<p>Clinical trial reporting remains fundamental to public trust and to the integrity of drug development. Nevertheless, the field continues to face persistent <strong>transparency deficits</strong>, <strong>escalating costs</strong>, and <strong>reproducibility challenges</strong>.</p>
<p>Adopting open standards and collaborative platforms—such as the <strong>Pharmaverse</strong> ecosystem—together with broader open-source initiatives in R and related technologies, offers a practical path forward. These approaches enable greater transparency, improved efficiency, and rigorous, standards-based data practices that strengthen the scientific foundation of clinical research. Consequently, the level of trust can be further enhanced, and public welfare can be assured.</p>
<p>Join us in part 2 of this series where we take a look at interactive clinical trials data analysis using packages that create custom shiny applications specifically for this space.</p>
</section>
<section id="resources" class="level2">
<h2 class="anchored" data-anchor-id="resources">Resources</h2>
<ul>
<li><a href="https://pharmaverse.org/">Pharmaverse</a></li>
<li><a href="https://www.cdisc.org/standards/foundational">CDISC</a></li>
<li><a href="https://insightsengineering.github.io/tlg-catalog/stable/">TLG Catalog</a></li>
</ul>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:33:40.322563</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2025-05-12_faster_clinical_trial_reporting.../faster_clinical_trial_reporting.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{hee2025,
  author = {Hee, Fabian and Kouretsis, Alexandros and , APPSILON},
  title = {Faster {Clinical} {Trial} {Reporting:} {A} {Beginner’s}
    {Guide} to {Implementing} {CDISC} {SDTM} and {ADaM} {Standards} with
    {Open-Source} {R} {Packages}},
  date = {2025-09-12},
  url = {https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/faster_clinical_trial_reporting.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-hee2025" class="csl-entry quarto-appendix-citeas">
Hee, Fabian, Alexandros Kouretsis, and APPSILON. 2025. <span>“Faster
Clinical Trial Reporting: A Beginner’s Guide to Implementing CDISC SDTM
and ADaM Standards with Open-Source R Packages.”</span> September 12,
2025. <a href="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/faster_clinical_trial_reporting.html">https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/faster_clinical_trial_reporting.html</a>.
</div></div></section></div> ]]></description>
  <category>Technical</category>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/faster_clinical_trial_reporting.html</guid>
  <pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-09-12_faster_clinical_trial_reporting/pharmaverse-post.png" medium="image" type="image/png" height="81" width="144"/>
</item>
<item>
  <title>rtflite 1.0.0: Production-Ready Clinical TLFs in Python</title>
  <dc:creator>Yilong Zhang</dc:creator>
  <dc:creator>Nan Xiao</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/rtflite.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<p>We are thrilled to announce the release of <code>{rtflite}</code> 1.0.0, marking a significant milestone in bringing production-ready TLF generation capabilities in RTF format to Python for clinical trial reporting. This major release represents our commitment to providing the pharmaceutical industry with robust, reliable tools for creating tables, listings, and figures (TLFs) in RTF format.</p>
<section id="what-is-rtflite" class="level2">
<h2 class="anchored" data-anchor-id="what-is-rtflite">What is rtflite?</h2>
<p><code>{rtflite}</code> is a Python package designed specifically for generating TLFs in RTF format for clinical trial reporting. Inspired by the <code>{r2rtf}</code> it provides a programmatic interface to create highly customized TLFs that meet regulatory submission requirements. When used together with <a href="https://pharmaverse.github.io/py-pkglite/">pkglite for Python</a>, <a href="https://pharmaverse.github.io/rtflite/">rtflite</a> bridges the gap between Python’s data science ecosystem and the specialized requirements of clinical trial reporting and submission.</p>
</section>
<section id="major-enhancements-in-rtflite-1.0.0" class="level2">
<h2 class="anchored" data-anchor-id="major-enhancements-in-rtflite-1.0.0">Major enhancements in rtflite 1.0.0</h2>
<section id="pagination-capabilities" class="level3">
<h3 class="anchored" data-anchor-id="pagination-capabilities">Pagination capabilities</h3>
<p>With the <code>page_by</code>, <code>group_by</code>, and <code>subline_by</code> features in <code>RTFBody</code> introduced in rtflite 1.0.0, we can efficiently create paginated TLFs (<a href="https://pharmaverse.github.io/rtflite/articles/advanced-group-by/#multi-page-example-with-group-context">examples</a>).</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/ae.png" align="center" style="float:right" width="100%"></p>
</section>
<section id="embedding-figures" class="level3">
<h3 class="anchored" data-anchor-id="embedding-figures">Embedding figures</h3>
<p>With the <code>RTFFigure</code> feature introduced in rtflite 1.0.0, we can embed multiple figures with titles, footnotes, and data sources (<a href="https://pharmaverse.github.io/rtflite/articles/example-figure/">examples</a>).</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/figure.png" align="center" style="float:right" width="100%"></p>
</section>
<section id="table-combination" class="level3">
<h3 class="anchored" data-anchor-id="table-combination">Table combination</h3>
<p><code>RTFDocument</code> now supports a list of tables. This allows users to combine multiple tables to create advanced layouts (<a href="https://pharmaverse.github.io/rtflite/articles/example-figure/">examples</a>).</p>
<p><img src="https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/efficacy.png" align="center" style="float:right" width="100%"></p>
</section>
<section id="getting-started" class="level3">
<h3 class="anchored" data-anchor-id="getting-started">Getting started</h3>
<p>Please check out the <a href="https://pharmaverse.github.io/rtflite/articles/quickstart/">rtflite quick start guide</a>.</p>
</section>
</section>
<section id="acknowledgments" class="level2">
<h2 class="anchored" data-anchor-id="acknowledgments">Acknowledgments</h2>
<p>We acknowledge the pharmaverse community for feedback and contributions, the r2rtf team for architectural inspiration, and the <a href="https://docs.astral.sh/uv/">uv project</a> for simplifying Python environment management. uv is a fast, Rust-based tool that unifies dependency resolution, packaging, and isolated environments which helped saving our time in building, testing, and publishing Python packages. We also appreciate Claude Code for accelerating our AI-assisted development workflow. For project architecture, coding standards, and shared workflows, see our <a href="https://github.com/pharmaverse/rtflite/blob/main/CLAUDE.md"><code>CLAUDE.md</code></a> and <a href="https://pharmaverse.github.io/rtflite/contributing/">contributing guidelines</a>.</p>
</section>
<section id="disclaimer" class="level2">
<h2 class="anchored" data-anchor-id="disclaimer">Disclaimer</h2>
<p>This blog contains opinions that are of the authors alone and do not necessarily reflect the strategy of their respective organizations.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:35:41.000888</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/2025-08-11_rtflite_1.0.0.../rtflite.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{zhang2025,
  author = {Zhang, Yilong and Xiao, Nan},
  title = {Rtflite 1.0.0: {Production-Ready} {Clinical} {TLFs} in
    {Python}},
  date = {2025-08-13},
  url = {https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/rtflite.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-zhang2025" class="csl-entry quarto-appendix-citeas">
Zhang, Yilong, and Nan Xiao. 2025. <span>“Rtflite 1.0.0:
Production-Ready Clinical TLFs in Python.”</span> August 13, 2025. <a href="https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/rtflite.html">https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/rtflite.html</a>.
</div></div></section></div> ]]></description>
  <category>TLG</category>
  <category>Python</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/rtflite.html</guid>
  <pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-08-13_rtflite_100/logo.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>Metacore and Metatools 0.2.0</title>
  <dc:creator>Liam Hobby</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-08-04_metacore_020/metacore_020.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="metacore-and-metatools-have-a-new-package-maintainer" class="level2">
<h2 class="anchored" data-anchor-id="metacore-and-metatools-have-a-new-package-maintainer"><code>{metacore}</code> and <code>{metatools}</code> have a new package maintainer</h2>
<p>Hi, everyone! I’m <a href="https://www.linkedin.com/in/liam-hobby/" title="Liam Hobby">Liam</a> and I’m excited to announce that I have taken over as package maintainer for both <code>{metacore}</code> and <code>{metatools}</code> from Christina Fillmore. I work at GSK as a clinical programmer and I am coming to the end of my second year in the industry. This is my first experience working within the open-source world, but I am a regular user of pharmaverse packages and am keen to get more involved with the community.</p>
<p>Christina remains on-hand as a mentor and I’d like to thank both her and Ben Straub for the continued support before we dive into the details of <code>{metacore}</code>/<code>{metatools}</code> 0.2.0.</p>
</section>
<section id="whats-new-in-metacore" class="level2">
<h2 class="anchored" data-anchor-id="whats-new-in-metacore">What’s new in metacore?</h2>
<p>The goal of version 0.2.0 was to clarify the distinction between an imported Metacore spec, containing information about multiple datasets, and a subsetted spec containing information about just a single dataset (as achieved via metacore::select_dataset()).</p>
<p>We received a number of questions and issues raised where users were attempting to use a Metacore object containing metadata for multiple datasets in functions from <code>{metatools}</code> that were designed to take a single, subsetted specification. When developing datasets, the typical workflow is to be working on a single dataset at a time - so subsetting the Metacore object is the logical thing to do. The issue was that the approach to functions in <code>{metatools}</code> was inconsistent, with some functions permitting multiple specification metadata and others not.</p>
<p>Now, a Metacore object which has multiple datasets or one with a single dataset have been redesigned to be programmatically distinct, with the single dataset implemented as a subclass of Metacore called “DatasetMeta”.</p>
<p>From the users’ perspective there is one key change. <strong>A metadata object about a single dataset will be required for users to work with <code>{metatools}</code> functions</strong>, which have had their API harmonised to accept only subsetted Metacore objects (via <code>metacore::select_dataset()</code>).</p>
<p>The print statements of both combined and subsetted Metacore objects have been refined to better illustrate the differences between them and provide more helpful information to the user.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dplyr)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>
Attaching package: 'dplyr'</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>The following objects are masked from 'package:stats':

    filter, lag</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(metacore)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Attaching package `metacore`

As of metacore 0.3.0 the `keep` variable in the `ds_vars` table has been renamed to `mandatory`. Please see release documentation for details.</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb7-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(metatools)</span>
<span id="cb7-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tibble)</span>
<span id="cb7-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(haven)</span>
<span id="cb7-4"></span>
<span id="cb7-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">load</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metacore_example</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pilot_ADaM.rda"</span>))</span>
<span id="cb7-6">metacore</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>── Metacore object contains metadata for 5 datasets ────────────────────────────</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ADSL (Subject-Level Analysis Dataset)</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ADADAS (ADAS-Cog Analysis)</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ADLBC (Analysis Dataset Lab Blood Chemistry)</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ADTTE (AE Time To 1st Derm. Event Analysis)</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ADAE (Adverse Events Analysis Dataset)</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code></code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>ℹ To use the Metacore object with metatools package, first subset a dataset using `metacore::select_dataset()`</code></pre>
</div>
</div>
<p>The <code>metacore::select_dataset()</code> function is now explicit about what is being selected:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb16-1">adsl_spec <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select_dataset</span>(metacore, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ADSL"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">quiet =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Warning: The `quiet` argument of `select_dataset()` is deprecated as of metacore 0.3.0.
ℹ Please use the `verbose` argument instead.</code></pre>
</div>
</div>
<p>Printing the subsetted object now provides more detailed information:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb18-1">adsl_spec</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>── Dataset specification object for ADSL (Subject-Level Analysis Dataset) ──────</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>The dataset contains 51 variables</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>Dataset key: USUBJID</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code></code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>The structure of the specification object is:</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ codelist: character [16 x 4] code_id, name, type, codes</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ derivations: character [50 x 2] derivation_id derivation</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ds_spec: character [1 x 3] dataset, structure, label</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ ds_vars: character [51 x 7] dataset, variable, key_seq, order, keep, core,
  supp_flag</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ supp: character [0 x 4] dataset, variable, idvar, qeval</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ value_spec: character [51 x 8] dataset, variable, code_id, derivation_id,
  type, origin, where, sig_dig</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>→ var_spec: character [51 x 6] variable, type, length, label, format, common</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code></code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>To inspect the specification object use `View()` in the console.</code></pre>
</div>
</div>
<p>Functions that take a Metacore object as input will emit a helpful message if a subsetted object is not supplied.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb33" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb33-1">ds_list <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">DM =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read_xpt</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metatools_example</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dm.xpt"</span>)))</span>
<span id="cb33-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_var_from_codelist</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(), metacore)</span></code></pre></div></div>
<div class="cell-output cell-output-error">
<pre><code>Error in `verify_DatasetMeta()`:
! The object supplied to the argument `metacore` is not a subsetted
  Metacore object. Use `metacore::select_dataset()` to subset metadata for the
  required dataset.</code></pre>
</div>
</div>
<section id="related-soft-deprecation-of-dataset_name-in-metatools" class="level4">
<h4 class="anchored" data-anchor-id="related-soft-deprecation-of-dataset_name-in-metatools">Related: soft deprecation of <code>dataset_name</code> in metatools</h4>
<p>Additionally, the argument <code>dataset_name</code> has been <strong>soft-deprecated</strong> across all functions in <code>{metatools}</code>. While the argument is still available and will not break existing code, using it will now issue a warning. This change encourages users to adopt the preferred workflow, creating a subsetted Metacore object, and improves performance by avoiding repeated subsetting operations each time these functions are called.</p>
<p>The full list of affected functions is included below. The <code>dataset_name</code> argument will remain available for <strong>at least one year</strong> from the release date of 0.2.0 before being fully removed.</p>
<p><a href="https://pharmaverse.github.io/metatools/reference/build_from_derived.html" title="Build a dataset from derived"><code>build_from_derived</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/check_variables.html" title="Check Variable Names"><code>check_variables</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/check_unique_keys.html" title="Check Uniqueness of Records by Key"><code>check_unique_keys</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/make_supp_qual.html" title="Make Supplemental Qualifier"><code>make_supp_qual</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/drop_unspec_vars.html" title="Drop Unspecified Variables"><code>drop_unspec_vars</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/add_variables.html" title="Add Missing Variables"><code>add_variables</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/order_cols.html" title="Sort Columns by Order"><code>order_cols</code></a>, <a href="https://pharmaverse.github.io/metatools/reference/sort_by_key.html" title="Sort Rows by Key Sequence"><code>sort_by_key</code></a>.</p>
</section>
</section>
<section id="create_var_from_codelist" class="level2">
<h2 class="anchored" data-anchor-id="create_var_from_codelist"><code>create_var_from_codelist()</code></h2>
<p>metatools::create_var_from_codelist() now optionally allows the user to specify a codelist from which the new column should be generated. This is useful in situations like the one below where the user is trying to derive <code>PARAM</code> from <code>PARAMCD</code> but the codelist for the <code>out_var</code> (<code>PARAM</code>) does not contain the values of <code>PARAMCD</code>.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>ID</th>
<th>Order</th>
<th>Code</th>
<th>Decode</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>PARAM</td>
<td>1</td>
<td>Alanine Aminotransferase</td>
<td>Alanine Aminotransferase</td>
</tr>
<tr class="even">
<td>PARAM</td>
<td>2</td>
<td>Bilirubin</td>
<td>Bilirubin</td>
</tr>
<tr class="odd">
<td>PARAM</td>
<td>3</td>
<td>Creatine</td>
<td>Creatine</td>
</tr>
</tbody>
</table>
<p>Example of default usage not providing the correct result:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb35" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb35-1">adlbc_spec <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">suppressMessages</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select_dataset</span>(metacore, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ADLBC"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">quiet =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>))</span>
<span id="cb35-2">data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tibble</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PARAMCD =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALB"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALP"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALT"</span>))</span>
<span id="cb35-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_var_from_codelist</span>(data, adlbc_spec, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">input_var =</span> PARAMCD, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">out_var =</span> PARAM, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">strict =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 3 × 2
  PARAMCD PARAM
  &lt;chr&gt;   &lt;chr&gt;
1 ALB     &lt;NA&gt; 
2 ALP     &lt;NA&gt; 
3 ALT     &lt;NA&gt; </code></pre>
</div>
</div>
<p>By default, metatools::create_var_from_codelist() takes the codelist of the <code>out_var</code> as input. The user can now overwrite this default with a specific codelist (in this case <code>PARAMCD</code> below) to achieve the desired result.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>ID</th>
<th>Order</th>
<th>Code</th>
<th>Decode</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>PARAMCD</td>
<td>1</td>
<td>ALT</td>
<td>Alanine Aminotransferase</td>
</tr>
<tr class="even">
<td>PARAMCD</td>
<td>2</td>
<td>BILI</td>
<td>Bilirubin</td>
</tr>
<tr class="odd">
<td>PARAMCD</td>
<td>3</td>
<td>CREAT</td>
<td>Creatine</td>
</tr>
</tbody>
</table>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb37" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb37-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_var_from_codelist</span>(data, adlbc_spec, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">input_var =</span> PARAMCD, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">out_var =</span> PARAM, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">codelist =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">get_control_term</span>(adlbc_spec, PARAMCD), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">decode_to_code =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 3 × 2
  PARAMCD PARAM                         
  &lt;chr&gt;   &lt;chr&gt;                         
1 ALB     Albumin (g/L)                 
2 ALP     Alkaline Phosphatase (U/L)    
3 ALT     Alanine Aminotransferase (U/L)</code></pre>
</div>
</div>
<p>This function also provides a new option <code>strict</code>, which when set to <code>TRUE</code> (default) will issue a warning indicating any values in your input column that do not appear in the codelist.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb39" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb39-1">data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tibble</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PARAMCD =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALB"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALP"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ALT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DUMMY1"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DUMMY2"</span>))</span>
<span id="cb39-2">x <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_var_from_codelist</span>(data, adlbc_spec, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">input_var =</span> PARAMCD, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">out_var =</span> PARAM, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">codelist =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">get_control_term</span>(adlbc_spec, PARAMCD), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">decode_to_code =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">strict =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Warning: In `create_var_from_codelist()`: The following values present in the input
dataset are not present in the codelist: DUMMY1 and DUMMY2</code></pre>
</div>
</div>
</section>
<section id="create_cat_var" class="level2">
<h2 class="anchored" data-anchor-id="create_cat_var">create_cat_var()</h2>
<p>metatools::create_cat_var() has been updated so that users can now specify to create a new variable from either the <code>code</code> or <code>decode</code> column of the controlled terminology. Previously, a codelist set-up like the one below would be evaluated from the <code>code</code> column only, leaving out the “years” text from the new variable.</p>
<table class="caption-top table">
<caption>Example of a codelist for AGEGR2</caption>
<colgroup>
<col style="width: 11%">
<col style="width: 29%">
<col style="width: 16%">
<col style="width: 10%">
<col style="width: 11%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>ID</th>
<th>Name</th>
<th>Data Type</th>
<th>Order</th>
<th>Code</th>
<th>Decode</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>AGEGR2</td>
<td>Pooled Age Group 2</td>
<td>text</td>
<td>1</td>
<td>&lt;35</td>
<td>&lt;35 years</td>
</tr>
<tr class="even">
<td>AGEGR2</td>
<td>Pooled Age Group 2</td>
<td>text</td>
<td>2</td>
<td>35-49</td>
<td>35-49 years</td>
</tr>
<tr class="odd">
<td>AGEGR2</td>
<td>Pooled Age Group 2</td>
<td>text</td>
<td>3</td>
<td>&gt;= 50</td>
<td>&gt;= 50 years</td>
</tr>
</tbody>
</table>
<p>Now, specifying the option <code>create_from_decode = TRUE</code> will allow you to create the variable based on the text in the <code>decode</code> column. If you are using this option to also create a numeric coded variable (in this case <code>AGEGR2N</code>), ensure your CT is set up so that the <code>decode</code> columns match.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb41" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb41-1">dm <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read_xpt</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metatools_example</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dm.xpt"</span>))</span>
<span id="cb41-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_cat_var</span>(dm, adsl_spec, AGE, AGEGR2, AGEGR2N, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">create_from_decode =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb41-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(USUBJID, AGE, AGEGR2, AGEGR2N) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb41-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 5 × 4
  USUBJID       AGE AGEGR2      AGEGR2N
  &lt;chr&gt;       &lt;dbl&gt; &lt;chr&gt;         &lt;dbl&gt;
1 01-701-1015    63 18-64 years       1
2 01-701-1023    64 18-64 years       1
3 01-701-1028    71 65-80 years       2
4 01-701-1033    74 65-80 years       2
5 01-701-1034    77 65-80 years       2</code></pre>
</div>
</div>
<p>This function now also provides a default <code>strict = TRUE</code> option, that issues a warning message if there are values in the reference column that do not fit into the categories in the controlled terminology. This can be disabled with <code>strict = FALSE</code>.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb43" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb43-1">dm2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> dm <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb43-2">  tibble<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add_row</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">AGE =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb43-3">  tibble<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add_row</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">AGE =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>)</span>
<span id="cb43-4">x <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_cat_var</span>(dm2, adsl_spec, AGE, AGEGR2, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">create_from_decode =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Warning: There are 2 observations in AGE that do not fit into the provided categories
for AGEGR2. Please check your controlled terminology.</code></pre>
</div>
</div>
</section>
<section id="summary-of-other-changes" class="level2">
<h2 class="anchored" data-anchor-id="summary-of-other-changes">Summary of Other Changes</h2>
<ul>
<li><p>Fixed a bug where the presence of variables with VLM in the <code>value_spec</code> table would prevent variables of the same name in different datasets being populated in the <code>value_spec</code> table.</p></li>
<li><p>metatools::build_from_derived() adds new options for the <code>keep</code> parameter that allow users to derive either <code>all</code> or only <code>prerequisite</code> columns from source datasets. Thanks to Matt Bearham for this amendment!</p></li>
<li><p>metatools::combine_supp() now adds the label found in <code>QLABEL</code> to the <code>QNAM</code> columns that are derived from supplementary datasets. Thanks to Bill Denney for this amendment!</p></li>
<li><p>metatools::check_variables() now provides a <code>strict</code> option that will issue a warning rather than throw an error when <code>strict = FALSE</code>.</p></li>
<li><p><code>{cli}</code> output is now used across both packages and messaging for various functions has been improved.</p></li>
</ul>
</section>
<section id="whats-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-next">What’s next?</h2>
<p>The next step for both packages will be working through and closing out issues from the backlog, updating the examples and vignettes, and improving the user experience via more informative messaging.</p>
<p>For <code>{metacore}</code>, there has been some interest in a UI to help users write custom specification readers for specs not in the standard P21 format. So this will be explored as well.</p>
<p>I hope to release the next update towards the end of the year, looking at an approximately 6-monthly release schedule going forward. Until then I encourage people to explore some of the new features and provide feedback on the changes through GitHub at the links below:</p>
<ul>
<li><p><a href="https://github.com/atorus-research/metacore" title="GitHub - Metacore">Metacore</a></p></li>
<li><p><a href="https://github.com/pharmaverse/metatools" title="GitHub - Metatools">Metatools</a></p></li>
</ul>
<p>Thanks for reading!</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:53.449983</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_metacore_0.2.0/metacore_020.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{hobby2025,
  author = {Hobby, Liam},
  title = {Metacore and {Metatools} 0.2.0},
  date = {2025-08-04},
  url = {https://pharmaverse.github.io/blog/posts/2025-08-04_metacore_020/metacore_020.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-hobby2025" class="csl-entry quarto-appendix-citeas">
Hobby, Liam. 2025. <span>“Metacore and Metatools 0.2.0.”</span> August
4, 2025. <a href="https://pharmaverse.github.io/blog/posts/2025-08-04_metacore_020/metacore_020.html">https://pharmaverse.github.io/blog/posts/2025-08-04_metacore_020/metacore_020.html</a>.
</div></div></section></div> ]]></description>
  <category>Metadata</category>
  <category>ADaM</category>
  <category>Community</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-08-04_metacore_020/metacore_020.html</guid>
  <pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-08-04_metacore_020/metacore.png" medium="image" type="image/png" height="135" width="144"/>
</item>
<item>
  <title>Raw data for domains in the pharmaversesdtm package</title>
  <dc:creator>Shiyu Chen</dc:creator>
  <link>https://pharmaverse.github.io/blog/posts/2025-07-07_pharmaverse/pharmaverseraw__package.html</link>
  <description><![CDATA[ 





<!--------------- typical setup ----------------->
<!--------------- post begins here ----------------->
<section id="background" class="level2">
<h2 class="anchored" data-anchor-id="background">Background</h2>
<p>The <code>{pharmaversesdtm}</code> and <code>{pharmaverseadam}</code> packages have been available for some time, providing reusable examples for SDTM and ADaM datasets, respectively. However, one critical piece of the workflow was missing: the raw datasets that serve as the starting point for these examples.</p>
</section>
<section id="why-now" class="level2">
<h2 class="anchored" data-anchor-id="why-now">Why now?</h2>
<p>With the recent release of the <a href="https://pharmaverse.github.io/sdtm.oak/"><code>{sdtm.oak}</code></a> package — an open-source package that enables SDTM programming in R — we now have an opportunity to complete the picture. The new <a href="https://pharmaverse.github.io/pharmaverseraw/"><code>{pharmaverseraw}</code></a> package fills this gap by providing example raw datasets that can be used as input for <code>{pharmaversesdtm}</code> datasets generation with <code>{sdtm.oak}</code>.</p>
</section>
<section id="what-is-in-pharmaverseraw" class="level2">
<h2 class="anchored" data-anchor-id="what-is-in-pharmaverseraw">What is in <code>{pharmaverseraw}</code>?</h2>
<p>The <code>{pharmaverseraw}</code> package v0.1.0 is out on <a href="https://cran.r-project.org/web/packages/pharmaverseraw/index.html">CRAN</a>. It is also available from the pharmaverse site at: https://pharmaverse.org/e2eclinical/developers/. It includes <strong>raw datasets</strong> for the following SDTM domains:</p>
<p>- AE: Adverse Events</p>
<p>- DS: Subject Disposition</p>
<p>- DM: Demographics</p>
<p>- EC/EX: Exposure</p>
<p>These raw datasets in <code>{pharmaverseraw}</code> package are intentionally designed to be:</p>
<ul>
<li>EDC agnostic: They are not tied to any specific Electronic Data Capture (EDC) system like Rave or Veeva.</li>
<li>Standards agnostic: Some variables follow CDASH (Clinical Data Acquisition Standards Harmonization), while others do not. This reflects real-world data standards variability across companies.</li>
</ul>
<p>The <strong>annotated case report forms</strong> corresponding to the raw datasets are also present in the <code>inst\acrf</code> folder. These PDF files illustrate how each raw variable aligns with SDTM expectations, offering insight into the mapping logic used in <code>{sdtm.oak}</code>.</p>
</section>
<section id="how-are-these-datasets-created" class="level2">
<h2 class="anchored" data-anchor-id="how-are-these-datasets-created">How are these datasets created?</h2>
<p>The datasets in <code>{pharmaverseraw}</code> were created through <strong>reverse engineering</strong> - we started with the finalized SDTM datasets in <code>{pharmaversesdtm}</code> and worked backward to construct plausible raw datasets that could reasonably result in those SDTM outputs. This approach ensures data consistency while allowing us to demonstrate the flexibility of {sdtm.oak} in handling raw data in different formats.</p>
</section>
<section id="from-raw-to-sdtm" class="level2">
<h2 class="anchored" data-anchor-id="from-raw-to-sdtm">From raw to SDTM</h2>
<p>Using <code>{sdtm.oak}</code>, you can take raw datasets from <code>{pharmaverseraw}</code> and apply SDTM mapping functions to map the target SDTM variables. There will be new SDTM examples published using this data later at: https://pharmaverse.github.io/examples/sdtm/</p>
<p>Below is an example snippet that shows how to use a raw AE dataset from <code>{pharmaverseraw}</code> and generate SDTM AE variables with <code>{sdtm.oak}</code>:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(pharmaverseraw)</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(sdtm.oak)</span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dplyr)</span>
<span id="cb1-4"></span>
<span id="cb1-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Read in raw data</span></span>
<span id="cb1-6">ae_raw <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> pharmaverseraw<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span>ae_raw</span>
<span id="cb1-7"></span>
<span id="cb1-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Derive oak_id_vars</span></span>
<span id="cb1-9">ae_raw <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> ae_raw <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-10">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">generate_oak_id_vars</span>(</span>
<span id="cb1-11">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pat_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PATNUM"</span>,</span>
<span id="cb1-12">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_src =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ae_raw"</span></span>
<span id="cb1-13">  )</span>
<span id="cb1-14"></span>
<span id="cb1-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Map AETERM and AESDTH variables for AE domain</span></span>
<span id="cb1-16">ae <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span></span>
<span id="cb1-17">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Derive topic variable</span></span>
<span id="cb1-18">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Map AETERM using assign_no_ct, raw_var=IT.AETERM, tgt_var=AETERM</span></span>
<span id="cb1-19">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">assign_no_ct</span>(</span>
<span id="cb1-20">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_dat =</span> ae_raw,</span>
<span id="cb1-21">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"IT.AETERM"</span>,</span>
<span id="cb1-22">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tgt_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AETERM"</span>,</span>
<span id="cb1-23">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">id_vars =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">oak_id_vars</span>()</span>
<span id="cb1-24">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-25">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Map AESDTH using hardcode_no_ct and condition_add, raw_var=IT.AESDTH, tgt_var=AESDTH</span></span>
<span id="cb1-26">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># If Yes then AESDTH = Y else Not submitted</span></span>
<span id="cb1-27">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">hardcode_no_ct</span>(</span>
<span id="cb1-28">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_dat =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">condition_add</span>(ae_raw, IT.AESDTH <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yes"</span>),</span>
<span id="cb1-29">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"IT.AESDTH"</span>,</span>
<span id="cb1-30">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tgt_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AESDTH"</span>,</span>
<span id="cb1-31">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tgt_val =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Y"</span>,</span>
<span id="cb1-32">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">id_vars =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">oak_id_vars</span>()</span>
<span id="cb1-33">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-34">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">hardcode_no_ct</span>(</span>
<span id="cb1-35">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_dat =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">condition_add</span>(ae_raw, IT.AESDTH <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yes"</span>),</span>
<span id="cb1-36">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">raw_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"IT.AESDTH"</span>,</span>
<span id="cb1-37">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tgt_var =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AESDTH"</span>,</span>
<span id="cb1-38">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tgt_val =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Not Submitted"</span>,</span>
<span id="cb1-39">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">id_vars =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">oak_id_vars</span>()</span>
<span id="cb1-40">  )</span></code></pre></div></div>
</div>
</section>
<section id="get-involved" class="level2">
<h2 class="anchored" data-anchor-id="get-involved">Get involved</h2>
<p>Similar to the other tools under pharmaverse umbrella, the <code>{pharmaverseraw}</code> package is open-source and community-driven. We welcome volunteers who are interested in contributing to the continued development and improvement of this package.</p>
<p>If you’d like to get involved, here are some ways you can help:</p>
<p>- <strong>Add new raw datasets:</strong> Take other SDTM domains from the <code>{pharmaversesdtm}</code> package and create corresponding raw datasets using R. This will help expand the coverage of the package.</p>
<p>- <strong>Create mock aCRFs for the raw datasets:</strong> Develop annotated case report forms (aCRFs) that illustrate how the raw variables are mapped to align with SDTM standards.</p>
<p>- <strong>Prepare documentation:</strong> For each raw dataset you create, include documentation that explains the data structure, variable definitions, and any relevant notes.</p>
<p>Whether you’re a programmer, CDISC expert, or clinical data manager, your contributions can make a meaningful impact. Visit the <a href="https://github.com/pharmaverse/pharmaverseraw">github repository</a> to open up a issue or start a discussion.</p>
<!--------------- appendices go here ----------------->
</section>
<div class="cell">
<div class="cell-output-display">


</div>
</div>



<div id="quarto-appendix" class="default"><section id="last-updated" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Last updated</h2><div class="quarto-appendix-contents">

<p>2026-05-04 13:34:49.440789</p>
</div></section><section id="details" class="level2 appendix"><h2 class="anchored quarto-appendix-heading">Details</h2><div class="quarto-appendix-contents">

<p><a href="https://github.com/pharmaverse/blog/tree/main/posts/zzz_DO_NOT_EDIT_pharmaverse.../pharmaverseraw__package.qmd">Source</a>, <a href="https://pharmaverse.github.io/blog/session_info.html">Session info</a></p>
</div></section><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div><a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></div></div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{chen2025,
  author = {Chen, Shiyu},
  title = {Raw Data for Domains in the Pharmaversesdtm Package},
  date = {2025-07-07},
  url = {https://pharmaverse.github.io/blog/posts/2025-07-07_pharmaverse/pharmaverseraw__package.html},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-chen2025" class="csl-entry quarto-appendix-citeas">
Chen, Shiyu. 2025. <span>“Raw Data for Domains in the Pharmaversesdtm
Package.”</span> July 7, 2025. <a href="https://pharmaverse.github.io/blog/posts/2025-07-07_pharmaverse/pharmaverseraw__package.html">https://pharmaverse.github.io/blog/posts/2025-07-07_pharmaverse/pharmaverseraw__package.html</a>.
</div></div></section></div> ]]></description>
  <category>SDTM</category>
  <guid>https://pharmaverse.github.io/blog/posts/2025-07-07_pharmaverse/pharmaverseraw__package.html</guid>
  <pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate>
  <media:content url="https://pharmaverse.github.io/blog/posts/2025-07-07_pharmaverse/pharmaverseraw.png" medium="image" type="image/png" height="148" width="144"/>
</item>
</channel>
</rss>
