The chevron R package provides functions to produce
standard tables, listings and graphs (TLGs) used to analyze and report
clinical trials data. The ensemble of function used to produce a
particular output are stored in an S4 object of virtual
class chevron_tlg. Each type of output are associated with
a specific class: chevron_t for tables,
chevron_l for listings and chevron_g for
graphs.
Each standard output is associated with one
chevron_tlg object. They contain the following
objects in separate slots:
main function also refereed to as
TLG-function.preprocess function.postprocess functionThe TLG-functions in chevron use other packages
to produce the final outputs, for example rtables and
tern are used to create tables, ggplot2,
lattice, and grid are used to create graphs,
rlistings to create listings.
TLG-functions in chevron such as
dmt01_main, aet02_main,
aet02_main have the following properties:
GDS). Note, that the naming convention
<gds template id>_main indicates that a Roche
GDS defined standard may have different implementations.
Or, alternatively, a GDS template id can be regarded as a
guideline and the function name in chevron as a
standard.adam_db which is the
collection of ADaM datasets (ADSL,
ADAE, ADRS, etc.). Please read the The
adam_db Argument vignette in this package for more
details.The preprocess functions in chevron use
base, dplyr and dunlin packages
to process input data object and turn them into a suitable input for
TLG-functions.
preprocess in chevron such as dmt01_pre,
aet02_pre, aet02_pre have the following
properties:
list of data.frame object
amenable to processing by a TLG-functions. message.adam_db which is the
collection of ADaM datasets (ADSL,
ADAE, ADRS, etc.). Please read the The
adam_db Argument vignette in this package for more
details.Please note that the ultimate responsible person of the preprocessing
functions is the end user. The provided preprocessing function is only a
template and users could modify depending on their need/data. This
preprocessing function will be printed to allow modification in script
generated in citril.
By default, the Postprocessing function returns its input or a null
report if the input has no rows. postprocessing
function of a chevron_tlg object must have at least
tlg as formal arguments.
AET02For example, the GDS template aet02 is
implemented in chevron with the chevropn_tlg
objects that have the name aet02.
We first load the data as a list of
data.frame, where each table represents a domain.
library(chevron)
#> Registered S3 method overwritten by 'tern':
#> method from
#> tidy.glm broom
data(syn_data, package = "chevron")A the aet02 output is then created as follows:
run(aet02, syn_data)
#> MedDRA System Organ Class A: Drug X B: Placebo C: Combination
#> MedDRA Preferred Term (N=15) (N=15) (N=15)
#> —————————————————————————————————————————————————————————————————————————————————————————————————————
#> Total number of patients with at least one adverse event 13 (86.7%) 14 (93.3%) 15 (100%)
#> Overall total number of events 58 59 99
#> cl B.2
#> Total number of patients with at least one adverse event 11 (73.3%) 8 (53.3%) 10 (66.7%)
#> Total number of events 18 15 20
#> dcd B.2.2.3.1 8 (53.3%) 6 (40.0%) 7 (46.7%)
#> dcd B.2.1.2.1 5 (33.3%) 6 (40.0%) 5 (33.3%)
#> cl D.1
#> Total number of patients with at least one adverse event 9 (60.0%) 5 (33.3%) 11 (73.3%)
#> Total number of events 13 9 19
#> dcd D.1.1.1.1 4 (26.7%) 4 (26.7%) 7 (46.7%)
#> dcd D.1.1.4.2 6 (40.0%) 2 (13.3%) 7 (46.7%)
#> cl A.1
#> Total number of patients with at least one adverse event 7 (46.7%) 6 (40.0%) 10 (66.7%)
#> Total number of events 8 11 16
#> dcd A.1.1.1.2 5 (33.3%) 6 (40.0%) 6 (40.0%)
#> dcd A.1.1.1.1 3 (20.0%) 1 (6.7%) 6 (40.0%)
#> cl B.1
#> Total number of patients with at least one adverse event 5 (33.3%) 6 (40.0%) 8 (53.3%)
#> Total number of events 6 6 12
#> dcd B.1.1.1.1 5 (33.3%) 6 (40.0%) 8 (53.3%)
#> cl C.2
#> Total number of patients with at least one adverse event 6 (40.0%) 4 (26.7%) 8 (53.3%)
#> Total number of events 6 4 12
#> dcd C.2.1.2.1 6 (40.0%) 4 (26.7%) 8 (53.3%)
#> cl D.2
#> Total number of patients with at least one adverse event 2 (13.3%) 5 (33.3%) 7 (46.7%)
#> Total number of events 3 5 10
#> dcd D.2.1.5.3 2 (13.3%) 5 (33.3%) 7 (46.7%)
#> cl C.1
#> Total number of patients with at least one adverse event 4 (26.7%) 4 (26.7%) 5 (33.3%)
#> Total number of events 4 9 10
#> dcd C.1.1.1.3 4 (26.7%) 4 (26.7%) 5 (33.3%)The function associated with a particular slot can be retrieved with
the corresponding method: main, lyt,
preprocess postprocess and
datasets.
main(aet02)
#> function (adam_db, arm_var = "ACTARM", row_split_var = "AEBODSYS",
#> lbl_overall = NULL, summary_labels = list(all = aet02_label,
#> TOTAL = c(nonunique = "Overall total number of events")),
#> ...)
#> {
#> assert_all_tablenames(adam_db, "adsl", "adae")
#> assert_string(arm_var)
#> assert_character(row_split_var, null.ok = TRUE)
#> assert_string(lbl_overall, null.ok = TRUE)
#> assert_valid_variable(adam_db$adsl, c("USUBJID", arm_var),
#> types = list(c("character", "factor")))
#> assert_valid_variable(adam_db$adae, c(arm_var, row_split_var,
#> "AEDECOD"), types = list(c("character", "factor")))
#> assert_valid_variable(adam_db$adae, "USUBJID", empty_ok = TRUE,
#> types = list(c("character", "factor")))
#> assert_valid_var_pair(adam_db$adsl, adam_db$adae, arm_var)
#> assert_list(summary_labels, null.ok = TRUE)
#> assert_subset(names(summary_labels), c("all", "TOTAL", row_split_var))
#> assert_subset(unique(unlist(lapply(summary_labels, names))),
#> c("unique", "nonunique", "unique_count"))
#> summary_labels <- expand_list(summary_labels, c("TOTAL",
#> row_split_var))
#> lbl_overall <- render_safe(lbl_overall)
#> lbl_row_split <- var_labels_for(adam_db$adae, row_split_var)
#> lbl_aedecod <- var_labels_for(adam_db$adae, "AEDECOD")
#> lyt <- occurrence_lyt(arm_var = arm_var, lbl_overall = lbl_overall,
#> row_split_var = row_split_var, lbl_row_split = lbl_row_split,
#> medname_var = "AEDECOD", lbl_medname_var = lbl_aedecod,
#> summary_labels = summary_labels, count_by = NULL)
#> tbl <- build_table(lyt, adam_db$adae, alt_counts_df = adam_db$adsl)
#> tbl
#> }
#> <bytecode: 0x000001bc06537a18>
#> <environment: namespace:chevron>These are standard functions that can be used on their own.
chevron_tlg object customizationIn some instances it is useful to customize the
chevron_tlg object, for example by changing the pre
processing functions in script generated. Please modify the code
directly inside the pre_fun, and make sure the function
returns a named list of data frames. Please be careful about the
argument names. The default argument of pre functions will
be override by the argument in spec.
chevron_tlg object creationIn some cases, you may want to create a new chevron_tlg
template. To create a chevron_tlg object from scratch, use
the provided constructors corresponding to the desired output:
chevron_t() for tables.chevron_l() for listings.chevron_g() for graphs.library(rtables)
library(tern)
my_template <- chevron_t(
main = "<your main function to build the table>",
preprocess = "<your pre function to process the data>",
postprocess = "<your post function to add custom sorting>"
)
run(my_template, syn_data)Note that to ensure the correct execution of the run
function, the name of the first argument of the main
function must be adam_db; the input list of
data.frame object to pre-process. The name of the first
argument of the preprocess function must be
adam_db; the input list object to create
TLG output and finally, the name of the first argument of
the postprocess function must be tlg, the
input TableTree object to post-process. Validation criteria
enforce these rules upon creation of a chevron_tlg
object.