diff --git a/.Rbuildignore b/.Rbuildignore index caeb33e..e1e2561 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -35,3 +35,6 @@ DEV\.R ^tests/testthat/test-utils_pw\.R$ ^tests/testthat/CRF_Dan_Export_SAS_XPORT_2022_08_25_15_16_pw\.zip$ + +^vignettes/*_files$ +^vignettes/articles$ diff --git a/DESCRIPTION b/DESCRIPTION index 28ff72f..5ffabdc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -40,6 +40,7 @@ Suggests: janitor, knitr, plotly, + quarto, rmarkdown, testthat (>= 3.1.8), vdiffr, @@ -49,4 +50,4 @@ Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.1 Config/testthat/edition: 3 Config/testthat/parallel: true -VignetteBuilder: knitr +VignetteBuilder: knitr, rmarkdown, quarto diff --git a/_pkgdown.yml b/_pkgdown.yml index a6d7dcb..133f3eb 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -50,10 +50,10 @@ reference: - title: "Clinical Utils" - contents: - ae_table_grade_max - - ae_plot_grade_max - ae_table_grade_n - ae_table_soc - - ae_table_grade_max + - ae_plot_grade_max + - ae_plot_grade_n - waterfall_plot - title: "List Utils" - contents: diff --git a/vignettes/articles/adverse_events.qmd b/vignettes/articles/adverse_events.qmd new file mode 100644 index 0000000..dbd581a --- /dev/null +++ b/vignettes/articles/adverse_events.qmd @@ -0,0 +1,184 @@ +--- +title: "Adverse Events" +vignette: > + %\VignetteIndexEntry{Adverse Events} + %\VignetteEngine{quarto::html} + %\VignetteEncoding{UTF-8} +--- + +```{r} +#| include = FALSE +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + + + + +On commence par charger la base TrialMaster comme on fait d'habitude. +Ici j'utilise la fonction `edc_example_ae()` pour ne pas dépendre de données réelles privées. + +```{r} +#| label = "setup", +#| message = FALSE, +#| warning = FALSE +library(EDCimport) +library(tidyverse) +library(flextable) +# tm = read_trialmaster("path/to/file.zip") +tm = edc_example_ae() +load_list(tm) + +head(ae) +head(enrolres) +``` + +## Macro `AE_grades` + +La macro `AE_grades` est traduite en deux fonctions : `ae_table_grade_max()` et `ae_table_grade_n()`. Ces fonctions retournent des objets de classe `crosstable`. +Ils ont une méthode `as_flextable` qui les transforme en table HTML de classe `flextable`. + +EDCimport comprend aussi la fonction `ae_plot_grade_max()` + +Voir la description du package `{crosstable}` pour plus d'informations: [documentation](https://danchaltiel.github.io/crosstable/reference/as_flextable.html).
+Voir la description du package `{flextable}` pour la liste des modificateurs (comme `add_footer_lines()`) : [documentation](https://davidgohel.github.io/flextable/reference/index.html). + +### Tableaux + +::: {.panel-tabset} + +#### `AE_grades1` + +Table des grades maximum par patient + +```{r} +ae_table_grade_max(df_ae=ae, df_enrol=enrolres, arm=NULL) %>% + as_flextable() %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at most one + AE of given grade") +``` + +#### `AE_grades2` + +Table des grades maximum par patient stratifié sur le bras + +On pourrait retrouver exactement la sortie SAS en mettant `total=FALSE`. + +```{r} +ae_table_grade_max(df_ae=ae, df_enrol=enrolres, arm="arm") %>% + as_flextable() %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at most one AE of given grade") +``` + +#### `AE_grades3` + +Table de tous les grades pour chaque patient + +```{r} +ae_table_grade_n(df_ae=ae, df_enrol=enrolres, arm=NULL) %>% + as_flextable() %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at least one AE of given grade") +``` + +On pourrait retrouver exactement la sortie SAS en mettant `total=FALSE`. + +```{r} +ae_table_grade_n(df_ae=ae, df_enrol=enrolres, arm="arm") %>% + as_flextable() %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at least one AE of given grade") +``` + + +#### `AE_grades4` + +Table des grades maximum par patient, filtrée sur les SAE + +La fonction ne prend pas en charge les SAE directement, il suffit de filtrer la table AE en amont. + +```{r} +ae %>% + filter(sae==TRUE) %>% + ae_table_grade_max(df_enrol=enrolres, arm=NULL) %>% + as_flextable() %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at most one SAE of given grade") +``` + +::: + +### Sorties Plots + +::: {.panel-tabset} + +#### `AE max` + +```{r} +#| fig.asp = 0.5, +#| fig.width = 7, +#| out.width = "100%" +ae_plot_grade_max(df_ae=ae, df_enrol=enrolres, + type = c("stack", "dodge", "fill")) & + labs(fill="Arm") +``` + +#### `AE N` + + +```{r} +#| fig.asp = 0.5, +#| fig.width = 7, +#| out.width = "100%" +ae_plot_grade_n(df_ae=ae, df_enrol=enrolres) +``` + +::: + +## Macro `AE_SOC` + + +La macro `AE_SOC` est traduite en la fonctions : `ae_table_soc()`. Cette fonction retourne des objets de classe `ae_table_soc`. Ils ont également une méthode `as_flextable` qui les transforme en table HTML de classe `flextable`, mais différente de celle de crosstable. + +Voir la description du package flextable pour la liste des modificateurs (comme `add_footer_lines()`) : [documentation](https://davidgohel.github.io/flextable/reference/index.html). + +Pour les sorties sur `{officer}`, comme ces tables sont très larges, pensez bien à basculer en format paysage en utilisant `officer::body_end_section_continuous()`, puis `officer::body_end_section_landscape()` pour revenir au format portrait. + +### Sortie *AE_SOC1*: Table des grades par soc et termes + +On peut ajouter `total=FALSE` pour retirer la colonne "Tot". + +```{r} +ae_table_soc(df_ae=ae, df_enrol=enrolres, term=NULL, arm=NULL, sort_by_ae=FALSE) %>% + as_flextable() %>% + add_footer_lines("In the header, N represents the number of patients.") %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at least one AE of given grade") +``` + +### Sortie *AE_SOC2*: Table des grades par soc et termes + +```{r} +##TODO exemple avec des TERMS +``` + +### Sortie *AE_SOC3*: Table des grades par termes uniquement, filtrée sur les SAE + +```{r} +##TODO ajouter vrais SAE +``` + +### Sortie *AE_SOC4*: Table des grades stratifiée sur le bras (sans colonne total) + +On peut ajouter `total=FALSE` pour retirer la colonne "Tot" et obtenir la sortie *AE_SOC5*. + +```{r} +ae_table_soc(df_ae=ae, df_enrol=enrolres, term=NULL, arm="arm", sort_by_ae=FALSE) %>% + as_flextable() %>% + add_footer_lines("In the header, N represents the number of patients.") %>% + add_footer_lines("Percentages are given as the proportion of patients presenting at least one AE of given grade") +``` + +### Sortie *AE_SOC6*: Table des soc et termes tous grades confondus stratifiée sur le bras + +```{r} +##TODO +```