Program

The previous examples in the libr documentation were intentionally simplified to focus on the workings of a particular function. It is helpful, however, to also view libr functions in the context of a complete program. The following example shows a complete program. The example illustrates how libr functions work together, and interact with tidyverse and sassy functions to create a report.

The data for this example has been included in the libr package as an external data file. It may be accessed using the system.file() function as shown below, or downloaded directly from the libr GitHub site here

library(tidyverse)
library(sassy)


# Prepare Log -------------------------------------------------------------


options("logr.autolog" = TRUE,
        "logr.notes" = FALSE)

# Get temp location for log and report output
tmp <- tempdir()

# Open log
lf <- log_open(file.path(tmp, "example1.log"))


# Load and Prepare Data ---------------------------------------------------

sep("Prepare Data")

# Get path to sample data
pkg <- system.file("extdata", package = "libr")

# Define data library
libname(sdtm, pkg, "csv", quiet = TRUE) 

# Prepare data
dm_mod <- sdtm$DM %>% 
  select(USUBJID, SEX, AGE, ARM) %>% 
  filter(ARM != "SCREEN FAILURE") %>% 
  datastep({
    
    if (AGE >= 18 & AGE <= 24)
      AGECAT = "18 to 24"
    else if (AGE >= 25 & AGE <= 44)
      AGECAT = "25 to 44"
    else if (AGE >= 45 & AGE <= 64)
      AGECAT <- "45 to 64"
    else if (AGE >= 65)
      AGECAT <- ">= 65"
    
  }) %>% put()

put("Get population counts")
arm_pop <- count(dm_mod, ARM) %>% put()
sex_pop <- count(dm_mod, SEX) %>% put()
agecat_pop <- count(dm_mod, AGECAT) %>% put()

# Convert agecat to factor so rows will sort correctly
agecat_pop$AGECAT <- factor(agecat_pop$AGECAT, levels = c("18 to 24", 
                                                          "25 to 44",
                                                          "45 to 64",
                                                          ">= 65"))
# Sort agecat
agecat_pop <- agecat_pop %>% arrange(AGECAT)


# Create Plots ------------------------------------------------------------


plt1 <- ggplot(data = arm_pop, aes(x = ARM, y = n)) +
  geom_col(fill = "#0000A0") +
  geom_text(aes(label = n), vjust = 1.5, colour = "white") +
  labs(x = "Treatment Group", y = "Number of Subjects (n)")

plt2 <- ggplot(data = sex_pop, aes(x = SEX, y = n)) +
  geom_col(fill = "#00A000") +
  geom_text(aes(label = n), vjust = 1.5, colour = "white") +
  labs(x = "Biological Sex", y = "Number of Subjects (n)")

plt3 <- ggplot(data = agecat_pop, aes(x = AGECAT, y = n)) +
  geom_col(fill = "#A00000") +
  geom_text(aes(label = n), vjust = 1.5, colour = "white") +
  labs(x = "Age Categories", y = "Number of Subjects (n)")


# Report ------------------------------------------------------------------


sep("Create and print report")


page1 <- create_plot(plt1, 4.5, 7) %>% 
  titles("Figure 1.1", "Distribution of Subjects by Treatment Group")

page2 <- create_plot(plt2, 4.5, 7) %>% 
  titles("Figure 1.2", "Distribution of Subjects by Biological Sex")

page3 <- create_plot(plt3, 4.5, 7) %>% 
  titles("Figure 1.2", "Distribution of Subjects by Age Category")

rpt <- create_report(file.path(tmp, "./output/example1.rtf"), output_type = "RTF", 
                     font = "Arial") %>% 
  set_margins(top = 1, bottom = 1) %>% 
  page_header("Sponsor: Company", "Study: ABC") %>% 
  add_content(page1) %>% 
  add_content(page2) %>% 
  add_content(page3) %>% 
  footnotes("Program: DM_Figure.R") %>% 
  page_footer(paste0("Date Produced: ", fapply(Sys.time(), "%d%b%y %H:%M")), 
              right = "Page [pg] of [tpg]")

res <- write_report(rpt)


# Clean Up ----------------------------------------------------------------
sep("Clean Up")

# Close log
log_close()

# View log
# file.show(lf)

# View report
# file.show(res$file_path)

Log

Here is the log from the above program:

=========================================================================
Log Path: C:/Users/dbosa/AppData/Local/Temp/RtmpwLpEIV/log/example1.log
Program Path: C:\packages\Testing\libr_example1.R
Working Directory: C:/packages/Testing
User Name: dbosa
R Version: 4.1.2 (2021-11-01)
Machine: SOCRATES x86-64
Operating System: Windows 10 x64 build 19041
Base Packages: stats graphics grDevices utils datasets methods base
Other Packages: tidylog_1.0.2 reporter_1.2.6 libr_1.2.1 fmtr_1.5.4 logr_1.2.7
                sassy_1.0.5 forcats_0.5.1 stringr_1.4.0 dplyr_1.0.7 purrr_0.3.4
                readr_2.0.2 tidyr_1.1.4 tibble_3.1.5 ggplot2_3.3.5 tidyverse_1.3.1
Log Start Time: 2021-11-20 23:06:50
=========================================================================

=========================================================================
Prepare Data
=========================================================================

# library 'sdtm': 8 items
- attributes: csv not loaded
- path: C:/Users/dbosa/Documents/R/win-library/4.1/libr/extdata
- items:
  Name Extension Rows Cols     Size        LastModified
1   AE       csv  150   27  88.3 Kb 2021-10-08 15:02:15
2   DA       csv 3587   18 528.1 Kb 2021-10-08 15:02:15
3   DM       csv   87   24  45.4 Kb 2021-10-08 15:02:15
4   DS       csv  174    9  33.9 Kb 2021-10-08 15:02:15
5   EX       csv   84   11  26.2 Kb 2021-10-08 15:02:15
6   IE       csv    2   14  13.2 Kb 2021-10-08 15:02:15
7   SV       csv  685   10  70.2 Kb 2021-10-08 15:02:15
8   VS       csv 3358   17 467.3 Kb 2021-10-08 15:02:15

lib_load: library 'sdtm' loaded

select: dropped 20 variables (STUDYID, DOMAIN, SUBJID, RFSTDTC, RFENDTC, <U+0085>)

filter: removed 2 rows (2%), 85 rows remaining

datastep: columns increased from 4 to 5

# A tibble: 85 x 5
   USUBJID    SEX     AGE ARM   AGECAT  
   <chr>      <chr> <dbl> <chr> <chr>   
 1 ABC-01-049 M        39 ARM D 25 to 44
 2 ABC-01-050 M        47 ARM B 45 to 64
 3 ABC-01-051 M        34 ARM A 25 to 44
 4 ABC-01-052 F        45 ARM C 45 to 64
 5 ABC-01-053 F        26 ARM B 25 to 44
 6 ABC-01-054 M        44 ARM D 25 to 44
 7 ABC-01-055 F        47 ARM C 45 to 64
 8 ABC-01-056 M        31 ARM A 25 to 44
 9 ABC-01-113 M        74 ARM D >= 65   
10 ABC-01-114 F        72 ARM B >= 65   
# ... with 75 more rows

Get population counts

count: now 4 rows and 2 columns, ungrouped

# A tibble: 4 x 2
  ARM       n
  <chr> <int>
1 ARM A    20
2 ARM B    21
3 ARM C    21
4 ARM D    23

count: now 2 rows and 2 columns, ungrouped

# A tibble: 2 x 2
  SEX       n
  <chr> <int>
1 F        32
2 M        53

count: now 4 rows and 2 columns, ungrouped

# A tibble: 4 x 2
  AGECAT       n
  <chr>    <int>
1 >= 65       13
2 18 to 24     5
3 25 to 44    23
4 45 to 64    44

=========================================================================
Create and print report
=========================================================================

# A report specification: 3 pages
- file_path: 'C:\Users\dbosa\AppData\Local\Temp\RtmpwLpEIV/./output/example1.rtf'
- output_type: RTF
- units: inches
- orientation: landscape
- margins: top 1 bottom 1 left 1 right 1
- line size/count: 9/40
- page_header: left=Sponsor: Company right=Study: ABC
- footnote 1: 'Program: DM_Figure.R'
- page_footer: left=Date Produced: 20Nov21 23:06 center= right=Page [pg] of [tpg]
- content: 
# A plot specification: 
- data: 4 rows, 2 cols
- layers: 2
- height: 4.5
- width: 7
- title 1: 'Figure 1.1'
- title 2: 'Distribution of Subjects by Treatment Group'
# A plot specification: 
- data: 2 rows, 2 cols
- layers: 2
- height: 4.5
- width: 7
- title 1: 'Figure 1.2'
- title 2: 'Distribution of Subjects by Biological Sex'
# A plot specification: 
- data: 4 rows, 2 cols
- layers: 2
- height: 4.5
- width: 7
- title 1: 'Figure 1.2'
- title 2: 'Distribution of Subjects by Age Category'

=========================================================================
Clean Up
=========================================================================

lib_sync: synchronized data in library 'sdtm'

lib_unload: library 'sdtm' unloaded

=========================================================================
Log End Time: 2021-11-20 23:06:57
Log Elapsed Time: 0 00:00:07
=========================================================================

Output

And here is the output:

Next: Complete Example 2