diff --git a/DESCRIPTION b/DESCRIPTION index b723e20..cbb453e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -46,8 +46,6 @@ Suggests: VignetteBuilder: knitr, rmarkdown -Remotes: - insightsengineering/rtables@981_cran_v0.6.11 Config/Needs/verdepcheck: insightsengineering/formatters, insightsengineering/rtables, tidyverse/magrittr, mllg/checkmate, rstudio/htmltools, gagolews/stringi, tidymodels/broom, cran/car, diff --git a/README.Rmd b/README.Rmd index 1bf4ace..a52f494 100644 --- a/README.Rmd +++ b/README.Rmd @@ -12,146 +12,50 @@ knitr::opts_chunk$set( comment = "#>", fig.path = "man/figures/README-" ) +suppressPackageStartupMessages(library(rtables.officer)) suppressPackageStartupMessages(library(rtables)) suppressPackageStartupMessages(library(dplyr)) ``` -# rtables +# rtables.officer -[![Check 🛠](https://github.com/insightsengineering/rtables/actions/workflows/check.yaml/badge.svg)](https://github.com/insightsengineering/rtables/actions/workflows/check.yaml) -[![Docs 📚](https://github.com/insightsengineering/rtables/actions/workflows/docs.yaml/badge.svg)](https://insightsengineering.github.io/rtables/) -[![Code Coverage 📔](https://raw.githubusercontent.com/insightsengineering/rtables/_xml_coverage_reports/data/main/badge.svg)](https://raw.githubusercontent.com/insightsengineering/rtables/_xml_coverage_reports/data/main/coverage.xml) - -![GitHub forks](https://img.shields.io/github/forks/insightsengineering/rtables?style=social) -![GitHub repo stars](https://img.shields.io/github/stars/insightsengineering/rtables?style=social) - -![GitHub commit activity](https://img.shields.io/github/commit-activity/m/insightsengineering/rtables) -![GitHub contributors](https://img.shields.io/github/contributors/insightsengineering/rtables) -![GitHub last commit](https://img.shields.io/github/last-commit/insightsengineering/rtables) -![GitHub pull requests](https://img.shields.io/github/issues-pr/insightsengineering/rtables) -![GitHub repo size](https://img.shields.io/github/repo-size/insightsengineering/rtables) -![GitHub language count](https://img.shields.io/github/languages/count/insightsengineering/rtables) +[![Check 🛠](https://github.com/insightsengineering/rtables.officer/actions/workflows/check.yaml/badge.svg)](https://github.com/insightsengineering/rtables.officer/actions/workflows/check.yaml) +[![Docs 📚](https://github.com/insightsengineering/rtables.officer/actions/workflows/docs.yaml/badge.svg)](https://insightsengineering.github.io/rtables.officer/) +[![Code Coverage 📔](https://raw.githubusercontent.com/insightsengineering/rtables.officer/_xml_coverage_reports/data/main/badge.svg)](https://raw.githubusercontent.com/insightsengineering/rtables.officer/_xml_coverage_reports/data/main/coverage.xml) + +![GitHub forks](https://img.shields.io/github/forks/insightsengineering/rtables.officer?style=social) +![GitHub repo stars](https://img.shields.io/github/stars/insightsengineering/rtables.officer?style=social) + +![GitHub commit activity](https://img.shields.io/github/commit-activity/m/insightsengineering/rtables.officer) +![GitHub contributors](https://img.shields.io/github/contributors/insightsengineering/rtables.officer) +![GitHub last commit](https://img.shields.io/github/last-commit/insightsengineering/rtables.officer) +![GitHub pull requests](https://img.shields.io/github/issues-pr/insightsengineering/rtables.officer) +![GitHub repo size](https://img.shields.io/github/repo-size/insightsengineering/rtables.officer) +![GitHub language count](https://img.shields.io/github/languages/count/insightsengineering/rtables.officer) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) -[![Open Issues](https://img.shields.io/github/issues-raw/insightsengineering/rtables?color=red\&label=open%20issues)](https://github.com/insightsengineering/rtables/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) +[![Open Issues](https://img.shields.io/github/issues-raw/insightsengineering/rtables.officer?color=red\&label=open%20issues)](https://github.com/insightsengineering/rtables.officer/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) -[![CRAN Version](https://www.r-pkg.org/badges/version/rtables)](https://CRAN.R-project.org/package=rtables) -[![Current Version](https://img.shields.io/github/r-package/v/insightsengineering/rtables/main?color=purple\&label=Development%20Version)](https://github.com/insightsengineering/rtables/tree/main) +[![Current Version](https://img.shields.io/github/r-package/v/insightsengineering/rtables.officer/main?color=purple\&label=Development%20Version)](https://github.com/insightsengineering/rtables.officer/tree/main) ## Reporting Tables with R The `rtables` R package was designed to create and display complex tables with R. The cells in an `rtable` may contain any high-dimensional data structure which can then be displayed with cell-specific formatting instructions. Currently, -`rtables` can be outputted in `ascii` `html`, and `pdf`, as well Power Point (via conversion to `flextable` objects). `rtf` support is in development and will be in a future release. +`rtables` can be outputted in `ascii` `html`, and `pdf`, as well Power Point (via conversion to `flextable` objects). This package `rtables.officer` is designed to support the exporting outputs relate Microsoft office software such as `word` and `powerpoint`. -`rtables` is developed and copy written by `F. Hoffmann-La Roche` and it is released open source under Apache +`rtables` and `rtables.officer` is developed and copy written by `F. Hoffmann-La Roche` and it is released open source under Apache License Version 2. -`rtables` development is driven by the need to create regulatory ready tables for health authority review. Some of the key requirements for this undertaking are listed below: - -* cell values and their visualization separate (i.e. no string based tables) - - values need to be programmatically accessible in their non-rounded state for cross-checking -* multiple values displayed within a cell -* flexible tabulation framework -* flexible formatting (cell spans, rounding, alignment, etc.) -* multiple output formats (html, ascii, latex, pdf, xml) -* flexible pagination in both horizontal and vertical directions -* distinguish between name and label in the data structure to work with `CDISC` standards -* title, footnotes, cell cell/row/column references - -`rtables` currently covers virtually all of these requirements, and further advances remain under active development. ## Installation -`rtables` is available on CRAN and you can install the latest released version with: - -```r -install.packages("rtables") -``` - -or you can install the latest development version directly from GitHub with: +`rtables.officer` can be installed with the latest development version directly from GitHub with: ```r # install.packages("pak") -pak::pak("insightsengineering/rtables") +pak::pak("insightsengineering/rtables.officer") ``` -Packaged releases (both those on CRAN and those between official CRAN releases) can be -found in the [releases list](https://github.com/insightsengineering/rtables/releases). - -To understand how to use this package, please refer to the [Introduction to `rtables`](https://insightsengineering.github.io/rtables/main/articles/rtables.html) article, which provides multiple examples of code implementation. - -## Cheatsheet - - - -## Usage - -We first demonstrate with a demographic table-like example and then show the creation of a more complex table. - -```{r, message=FALSE} -library(rtables) - -lyt <- basic_table() %>% - split_cols_by("ARM") %>% - analyze(c("AGE", "BMRKR1", "BMRKR2"), function(x, ...) { - if (is.numeric(x)) { - in_rows( - "Mean (sd)" = c(mean(x), sd(x)), - "Median" = median(x), - "Min - Max" = range(x), - .formats = c("xx.xx (xx.xx)", "xx.xx", "xx.xx - xx.xx") - ) - } else if (is.factor(x) || is.character(x)) { - in_rows(.list = list_wrap_x(table)(x)) - } else { - stop("type not supported") - } - }) - -build_table(lyt, ex_adsl) -``` - -```{r, message=FALSE} -library(rtables) -library(dplyr) - -## for simplicity grab non-sparse subset -ADSL <- ex_adsl %>% filter(RACE %in% levels(RACE)[1:3]) - -biomarker_ave <- function(x, ...) { - val <- if (length(x) > 0) round(mean(x), 2) else "no data" - in_rows( - "Biomarker 1 (mean)" = rcell(val) - ) -} - -basic_table(show_colcounts = TRUE) %>% - split_cols_by("ARM") %>% - split_cols_by("BMRKR2") %>% - split_rows_by("RACE", split_fun = trim_levels_in_group("SEX")) %>% - split_rows_by("SEX") %>% - summarize_row_groups() %>% - analyze("BMRKR1", biomarker_ave) %>% - build_table(ADSL) -``` - -# Acknowledgments - -We would like to thank everyone who has made `rtables` a better project by providing feedback and improving examples & vignettes. The following list of contributors is alphabetical: - -Maximo Carreras, Francois Collins, Saibah Chohan, Tadeusz Lewandowski, Nick Paszty, Nina Qi, Jana Stoilova, Heng Wang, Godwin Yung - -## Presentations -- R in Pharma 2023 - - Generating Tables, Listings, and Graphs using NEST / [cardinal](https://pharmaverse.github.io/cardinal/) [[Video](https://www.youtube.com/watch?v=YPmbLPSYFYM)] - - BBS Session on Regulatory Submissions of Clinical Trials [[Video](https://www.youtube.com/watch?v=yZS4OBuJe_Q)] -- R Medicine Virtual Conference 2023 [[Video](https://www.youtube.com/watch?v=sxFsavKI7s4)] -- Advanced rtables Training 2023 [[Part 1 Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/Advanced_rtables_part1.pdf)] [[Part 2 Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/Advances_rtables_part2.pdf)] -- R in Pharma 2022 - Creating Submission-Quality Clinical Trial Reporting Tables in R with rtables [[Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/Clinical_Trial_Reporting_Tables_in_R.pdf)] [[Video](https://www.youtube.com/watch?v=zBm_NZ0VtKs)] -- R Consortium 2022 - - R Adoption Series - Reporting Table Creation in R [[Video](https://www.youtube.com/watch?v=1i6vOId2h4A)] [[Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/r_adoption_slides.pdf)] - - Tables in Clinical Trials with R [[Book](https://rconsortium.github.io/rtrs-wg/)] -- useR! 2020 - rtables Layouting and Tabulation Framework [[Video](https://www.youtube.com/watch?v=CBQzZ8ZhXLA)] diff --git a/README.md b/README.md index 5293da6..db9e42e 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,42 @@ -# rtables +# rtables.officer [![Check -🛠](https://github.com/insightsengineering/rtables/actions/workflows/check.yaml/badge.svg)](https://github.com/insightsengineering/rtables/actions/workflows/check.yaml) +🛠](https://github.com/insightsengineering/rtables.officer/actions/workflows/check.yaml/badge.svg)](https://github.com/insightsengineering/rtables.officer/actions/workflows/check.yaml) [![Docs -📚](https://github.com/insightsengineering/rtables/actions/workflows/docs.yaml/badge.svg)](https://insightsengineering.github.io/rtables/) +📚](https://github.com/insightsengineering/rtables.officer/actions/workflows/docs.yaml/badge.svg)](https://insightsengineering.github.io/rtables.officer/) [![Code Coverage -📔](https://raw.githubusercontent.com/insightsengineering/rtables/_xml_coverage_reports/data/main/badge.svg)](https://raw.githubusercontent.com/insightsengineering/rtables/_xml_coverage_reports/data/main/coverage.xml) +📔](https://raw.githubusercontent.com/insightsengineering/rtables.officer/_xml_coverage_reports/data/main/badge.svg)](https://raw.githubusercontent.com/insightsengineering/rtables.officer/_xml_coverage_reports/data/main/coverage.xml) ![GitHub -forks](https://img.shields.io/github/forks/insightsengineering/rtables?style=social) +forks](https://img.shields.io/github/forks/insightsengineering/rtables.officer?style=social) ![GitHub repo -stars](https://img.shields.io/github/stars/insightsengineering/rtables?style=social) +stars](https://img.shields.io/github/stars/insightsengineering/rtables.officer?style=social) ![GitHub commit -activity](https://img.shields.io/github/commit-activity/m/insightsengineering/rtables) +activity](https://img.shields.io/github/commit-activity/m/insightsengineering/rtables.officer) ![GitHub -contributors](https://img.shields.io/github/contributors/insightsengineering/rtables) +contributors](https://img.shields.io/github/contributors/insightsengineering/rtables.officer) ![GitHub last -commit](https://img.shields.io/github/last-commit/insightsengineering/rtables) +commit](https://img.shields.io/github/last-commit/insightsengineering/rtables.officer) ![GitHub pull -requests](https://img.shields.io/github/issues-pr/insightsengineering/rtables) +requests](https://img.shields.io/github/issues-pr/insightsengineering/rtables.officer) ![GitHub repo -size](https://img.shields.io/github/repo-size/insightsengineering/rtables) +size](https://img.shields.io/github/repo-size/insightsengineering/rtables.officer) ![GitHub language -count](https://img.shields.io/github/languages/count/insightsengineering/rtables) +count](https://img.shields.io/github/languages/count/insightsengineering/rtables.officer) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) [![Open -Issues](https://img.shields.io/github/issues-raw/insightsengineering/rtables?color=red&label=open%20issues)](https://github.com/insightsengineering/rtables/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) +Issues](https://img.shields.io/github/issues-raw/insightsengineering/rtables.officer?color=red&label=open%20issues)](https://github.com/insightsengineering/rtables.officer/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) -[![CRAN -Version](https://www.r-pkg.org/badges/version/rtables)](https://CRAN.R-project.org/package=rtables) [![Current -Version](https://img.shields.io/github/r-package/v/insightsengineering/rtables/main?color=purple&label=Development%20Version)](https://github.com/insightsengineering/rtables/tree/main) +Version](https://img.shields.io/github/r-package/v/insightsengineering/rtables.officer/main?color=purple&label=Development%20Version)](https://github.com/insightsengineering/rtables.officer/tree/main) ## Reporting Tables with R @@ -48,186 +46,20 @@ tables with R. The cells in an `rtable` may contain any high-dimensional data structure which can then be displayed with cell-specific formatting instructions. Currently, `rtables` can be outputted in `ascii` `html`, and `pdf`, as well Power Point (via conversion to `flextable` objects). -`rtf` support is in development and will be in a future release. +This package `rtables.officer` is designed to support the exporting +outputs relate Microsoft office software such as `word` and +`powerpoint`. -`rtables` is developed and copy written by `F. Hoffmann-La Roche` and it -is released open source under Apache License Version 2. - -`rtables` development is driven by the need to create regulatory ready -tables for health authority review. Some of the key requirements for -this undertaking are listed below: - -- cell values and their visualization separate (i.e. no string based - tables) - - values need to be programmatically accessible in their non-rounded - state for cross-checking -- multiple values displayed within a cell -- flexible tabulation framework -- flexible formatting (cell spans, rounding, alignment, etc.) -- multiple output formats (html, ascii, latex, pdf, xml) -- flexible pagination in both horizontal and vertical directions -- distinguish between name and label in the data structure to work with - `CDISC` standards -- title, footnotes, cell cell/row/column references - -`rtables` currently covers virtually all of these requirements, and -further advances remain under active development. +`rtables` and `rtables.officer` is developed and copy written by +`F. Hoffmann-La Roche` and it is released open source under Apache +License Version 2. ## Installation -`rtables` is available on CRAN and you can install the latest released -version with: - -``` r -install.packages("rtables") -``` - -or you can install the latest development version directly from GitHub -with: +`rtables.officer` can be installed with the latest development version +directly from GitHub with: ``` r # install.packages("pak") -pak::pak("insightsengineering/rtables") +pak::pak("insightsengineering/rtables.officer") ``` - -Packaged releases (both those on CRAN and those between official CRAN -releases) can be found in the [releases -list](https://github.com/insightsengineering/rtables/releases). - -To understand how to use this package, please refer to the [Introduction -to -`rtables`](https://insightsengineering.github.io/rtables/main/articles/rtables.html) -article, which provides multiple examples of code implementation. - -## Cheatsheet - - - -## Usage - -We first demonstrate with a demographic table-like example and then show -the creation of a more complex table. - -``` r -library(rtables) - -lyt <- basic_table() %>% - split_cols_by("ARM") %>% - analyze(c("AGE", "BMRKR1", "BMRKR2"), function(x, ...) { - if (is.numeric(x)) { - in_rows( - "Mean (sd)" = c(mean(x), sd(x)), - "Median" = median(x), - "Min - Max" = range(x), - .formats = c("xx.xx (xx.xx)", "xx.xx", "xx.xx - xx.xx") - ) - } else if (is.factor(x) || is.character(x)) { - in_rows(.list = list_wrap_x(table)(x)) - } else { - stop("type not supported") - } - }) - -build_table(lyt, ex_adsl) -#> A: Drug X B: Placebo C: Combination -#> ———————————————————————————————————————————————————————————— -#> AGE -#> Mean (sd) 33.77 (6.55) 35.43 (7.90) 35.43 (7.72) -#> Median 33.00 35.00 35.00 -#> Min - Max 21.00 - 50.00 21.00 - 62.00 20.00 - 69.00 -#> BMRKR1 -#> Mean (sd) 5.97 (3.55) 5.70 (3.31) 5.62 (3.49) -#> Median 5.39 4.81 4.61 -#> Min - Max 0.41 - 17.67 0.65 - 14.24 0.17 - 21.39 -#> BMRKR2 -#> LOW 50 45 40 -#> MEDIUM 37 56 42 -#> HIGH 47 33 50 -``` - -``` r -library(rtables) -library(dplyr) - -## for simplicity grab non-sparse subset -ADSL <- ex_adsl %>% filter(RACE %in% levels(RACE)[1:3]) - -biomarker_ave <- function(x, ...) { - val <- if (length(x) > 0) round(mean(x), 2) else "no data" - in_rows( - "Biomarker 1 (mean)" = rcell(val) - ) -} - -basic_table(show_colcounts = TRUE) %>% - split_cols_by("ARM") %>% - split_cols_by("BMRKR2") %>% - split_rows_by("RACE", split_fun = trim_levels_in_group("SEX")) %>% - split_rows_by("SEX") %>% - summarize_row_groups() %>% - analyze("BMRKR1", biomarker_ave) %>% - build_table(ADSL) -#> A: Drug X B: Placebo C: Combination -#> LOW MEDIUM HIGH LOW MEDIUM HIGH LOW MEDIUM HIGH -#> (N=45) (N=35) (N=46) (N=42) (N=48) (N=31) (N=40) (N=39) (N=47) -#> ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— -#> ASIAN -#> F 13 (28.9%) 9 (25.7%) 19 (41.3%) 9 (21.4%) 18 (37.5%) 9 (29.0%) 13 (32.5%) 9 (23.1%) 17 (36.2%) -#> Biomarker 1 (mean) 5.23 6.17 5.38 5.64 5.55 4.33 5.46 5.48 5.19 -#> M 8 (17.8%) 7 (20.0%) 10 (21.7%) 12 (28.6%) 10 (20.8%) 8 (25.8%) 5 (12.5%) 11 (28.2%) 16 (34.0%) -#> Biomarker 1 (mean) 6.77 6.06 5.54 4.9 4.98 6.81 6.53 5.47 4.98 -#> U 1 (2.2%) 1 (2.9%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 1 (3.2%) 0 (0.0%) 1 (2.6%) 1 (2.1%) -#> Biomarker 1 (mean) 4.68 7.7 no data no data no data 6.97 no data 11.93 9.01 -#> BLACK OR AFRICAN AMERICAN -#> F 6 (13.3%) 3 (8.6%) 9 (19.6%) 6 (14.3%) 8 (16.7%) 2 (6.5%) 7 (17.5%) 4 (10.3%) 3 (6.4%) -#> Biomarker 1 (mean) 5.01 7.2 6.79 6.15 5.26 8.57 5.72 5.76 4.58 -#> M 5 (11.1%) 5 (14.3%) 2 (4.3%) 3 (7.1%) 5 (10.4%) 4 (12.9%) 4 (10.0%) 5 (12.8%) 5 (10.6%) -#> Biomarker 1 (mean) 6.92 5.82 11.66 4.46 6.14 8.47 6.16 5.25 4.83 -#> U 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 1 (2.5%) 1 (2.6%) 0 (0.0%) -#> Biomarker 1 (mean) no data no data no data no data no data no data 2.79 9.82 no data -#> UNDIFFERENTIATED 1 (2.2%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 2 (5.0%) 0 (0.0%) 0 (0.0%) -#> Biomarker 1 (mean) 9.48 no data no data no data no data no data 6.46 no data no data -#> WHITE -#> F 6 (13.3%) 7 (20.0%) 4 (8.7%) 5 (11.9%) 6 (12.5%) 6 (19.4%) 6 (15.0%) 3 (7.7%) 2 (4.3%) -#> Biomarker 1 (mean) 4.43 7.83 4.52 6.42 5.07 7.83 6.71 5.87 10.7 -#> M 4 (8.9%) 3 (8.6%) 2 (4.3%) 6 (14.3%) 1 (2.1%) 1 (3.2%) 2 (5.0%) 5 (12.8%) 3 (6.4%) -#> Biomarker 1 (mean) 5.81 7.23 1.39 4.72 4.58 12.87 2.3 5.1 5.98 -#> U 1 (2.2%) 0 (0.0%) 0 (0.0%) 1 (2.4%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) 0 (0.0%) -#> Biomarker 1 (mean) 3.94 no data no data 3.77 no data no data no data no data no data -``` - -# Acknowledgments - -We would like to thank everyone who has made `rtables` a better project -by providing feedback and improving examples & vignettes. The following -list of contributors is alphabetical: - -Maximo Carreras, Francois Collins, Saibah Chohan, Tadeusz Lewandowski, -Nick Paszty, Nina Qi, Jana Stoilova, Heng Wang, Godwin Yung - -## Presentations - -- R in Pharma 2023 - - Generating Tables, Listings, and Graphs using NEST / - [cardinal](https://pharmaverse.github.io/cardinal/) - \[[Video](https://www.youtube.com/watch?v=YPmbLPSYFYM)\] - - BBS Session on Regulatory Submissions of Clinical Trials - \[[Video](https://www.youtube.com/watch?v=yZS4OBuJe_Q)\] -- R Medicine Virtual Conference 2023 - \[[Video](https://www.youtube.com/watch?v=sxFsavKI7s4)\] -- Advanced rtables Training 2023 \[[Part 1 - Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/Advanced_rtables_part1.pdf)\] - \[[Part 2 - Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/Advances_rtables_part2.pdf)\] -- R in Pharma 2022 - Creating Submission-Quality Clinical Trial - Reporting Tables in R with rtables - \[[Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/Clinical_Trial_Reporting_Tables_in_R.pdf)\] - \[[Video](https://www.youtube.com/watch?v=zBm_NZ0VtKs)\] -- R Consortium 2022 - - R Adoption Series - Reporting Table Creation in R - \[[Video](https://www.youtube.com/watch?v=1i6vOId2h4A)\] - \[[Slides](https://github.com/insightsengineering/rtables/blob/main/inst/extdata/r_adoption_slides.pdf)\] - - Tables in Clinical Trials with R - \[[Book](https://rconsortium.github.io/rtrs-wg/)\] -- useR! 2020 - rtables Layouting and Tabulation Framework - \[[Video](https://www.youtube.com/watch?v=CBQzZ8ZhXLA)\]