Creation of a clinical data review report

Laure Cougnaud, Michela Pasetto

October 01, 2021

Utility functions are provided to create a standard clinical data review report. Please note that the examples in this section are only informative, and not evaluated in the vignette itself.


1 Create an example report

To create your clinical data review report, we advise to start from a skeleton of such report, via:


This report is based on an example dataset (subset of the CDISC Pilot 01 dataset), available in the clinUtils package.

The report is created via:


You can further tailor the report to your dataset(s) of interest and sections of interest.

See the next sections for further informations.

2 File structure

2.1 Input

The input for the clinical data report consists of a set of Rmardown files and a config directory.

Rmd files

A set of Rmarkdown files in the working directory should be

Config files

There should be a config directory containing:

Please see the ? clinDataReview-templates documentation for further information on the template reports available in the clinDataReview package, and their input parameters.

2.2 Output

The clinical data report consists of a final report output and a set of intermediary results.

Final output

A final output folder (‘report’ by default) containing the:

Intermediary results

A folder of intermediary results (‘interim’ by default) containing:

3 Template reports

A set of template reports are available in the clinDataReview package itself.

The full list of the reports and the corresponding input parameters is available at: ?clinDataReview-templates.

To use a template available in the package for one of your report, your config file should contain the corresponding name of the template via the template tag and the templatePackage set to ‘clinDataReview’.

For example, to include a division in the report, your YAML config file should be formatted as:

template: divisionTemplate.Rmd
templatePackage: clinDataReview
reportTitle: "Title for a chapter"
reportTitleLevel: 1

4 Render a clinical data review report

4.1 Production

4.1.1 Create a report for production

The function render_clinDataReviewReport renders a clinical data report for production.


The render_clinDataReviewReport creates several html files, one per section/subsection.

To open the full report, the user should open the introduction.html file.

In case a lot of different html chapters are created, a landing page can be created to guide the end-user to the opening of the report.

4.1.2 Create redirect page

A convenient way to store all html files into one location, and have only one page to look for to open the report is the function


This function:

  • stores all html files into a folder
  • create a landing page next to the folder that allows the user to navigate through the report.

The default names of the folder and landing page are report_dependencies and report.html. The names can be changed by the user.

4.1.3 Zip and send the report to collaborators

A dedicated functionality is available to zip the report and send it to colleagues within the team.

Once a report has been rendered, the user can call:


This function zips the report, so that the analyses can be easily put as attachement in a mail/uploaded to a shared drive.

If the folder is not unzipped before opening the reports, a message in the browser reminds to unzip the documents.

4.1.4 Add metadata

Metadata can be added in the landing page, containing information concerning the data set creation time, the path to the original data etc.

A metadata file should be in yaml format.

The metadata function can be directly called in a Rmd documents with


4.2 Development

To facilitate the creation of the report, a few utility functions & dedicated parameters are available.

4.2.1 Modular framework (Re-)run part(s) of the report

In case the creation of the entire report is time-consuming, and only part(s) of the report have been updated, it might be interesting to only re-run some parts of the report. Config files associated to the parts of the report that should be rerun can be specified via the configFiles parameter.

# run one specific report
clinDataReview::render_clinDataReviewReport(configFiles = "config-AE_timeprofile.yml")
# only run the listings:
clinDataReview::render_clinDataReviewReport(configFiles = list.files(pattern = "listing", "config")) Create the final clinical data report from the Markdown reports

To convert all created Markdown files to HTML, the dedicated function convertMdToHtml can be used.


4.2.2 Debug a sub-report

To debug a sub-report, it might be interesting to run only one specific R report in the current R session, with the parameters provided by the associated config file. This can be achieved as followed:

# get parameters from the general 'config.yml' and the specified config file
params <- getParamsFromConfig(configFile = "config-AE_timeprofile.yml")

# extract template from package if specified
if(params$templatePackage == "clinDataReview"){
  pathTemplate <- clinDataReview::getPathTemplate(file = params$template)
  file.copy(from = pathTemplate, to = ".")

# run a current chapter (without clinical data Js libraries)
# Note that Js library to have the functionality to download patient profiles is not imported
rmarkdown::render(input = params$template)

# preview a specific chapter (with clinical data Js libraries)
bookdown::render_book(input = params$template, preview = TRUE)
# include the index file:
bookdown::render_book(input = c("index.Rmd", params$template), preview = TRUE)

5 Appendix

5.1 Session info

R version 4.1.1 (2021-08-10)

Platform: x86_64-pc-linux-gnu (64-bit)


attached base packages: stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: clinDataReview(v.1.2.0), pander(v.0.6.4) and knitr(v.1.36)

loaded via a namespace (and not attached): tidyselect(v.1.1.1), xfun(v.0.26), bslib(v.0.3.0), purrr(v.0.3.4), haven(v.2.4.3), V8(v.3.4.2), colorspace(v.2.0-2), vctrs(v.0.3.8), generics(v.0.1.0), htmltools(v.0.5.2), viridisLite(v.0.4.0), yaml(v.2.2.1), utf8(v.1.2.2), plotly(v., rlang(v.0.4.11), jquerylib(v.0.1.4), pillar(v.1.6.3), glue(v.1.4.2), plyr(v.1.8.6), lifecycle(v.1.0.1), stringr(v.1.4.0), munsell(v.0.5.0), gtable(v.0.3.0), htmlwidgets(v.1.5.4), evaluate(v.0.14), forcats(v.0.5.1), fastmap(v.1.1.0), crosstalk(v.1.1.1), curl(v.4.3.2), fansi(v.0.5.0), Rcpp(v.1.0.7), scales(v.1.1.1), DT(v.0.19), jsonvalidate(v.1.1.0), clinUtils(v.0.1.0), jsonlite(v.1.7.2), hms(v.1.1.1), ggplot2(v.3.3.5), digest(v.0.6.28), stringi(v.1.7.4), bookdown(v.0.24), dplyr(v.1.0.7), grid(v.4.1.1), tools(v.4.1.1), magrittr(v.2.0.1), sass(v.0.4.0), lazyeval(v.0.2.2), tibble(v.3.1.5), crayon(v.1.4.1), tidyr(v.1.1.4), pkgconfig(v.2.0.3), ellipsis(v.0.3.2), data.table(v.1.14.2), rmarkdown(v.2.11), httr(v.1.4.2), R6(v.2.5.1) and compiler(v.4.1.1)