knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(rmarkdown.html_vignette.check_title = FALSE)
The previous examples in the logr documentation were intentionally simplified to focus on the workings of a particular function. It is helpful, however, to also view logr functions in the context of a complete program. The following example shows a complete program. The example illustrates how logr functions work together, and interact with tidyverse and sassy functions to create a comprehensive log.
This example has been chosen because it incorporates many of the functions that will log automatically. If you want to maximize the auto-generation features of logr, take note of these functions.
The data for this example has been included in the logr package as an
external data file. It may be accessed using the system.file()
function
as shown below, or downloaded directly from the logr GitHub site
here
library(tidyverse) library(sassy) options("logr.autolog" = TRUE) # Get temp location for log and report output tmp <- tempdir() # Open the log lf <- log_open(file.path(tmp, "example1.log")) # Send code to the log log_code() sep("Load the data") # Get path to sample data pkg <- system.file("extdata", package = "logr") # Define data library libname(sdtm, pkg, "csv") # Prepare Data ------------------------------------------------------------- sep("Prepare the data") # Define format for age groups ageg <- value(condition(x > 18 & x <= 29, "18 to 29"), condition(x >= 30 & x <= 44, "30 to 44"), condition(x >= 45 & x <= 59, "45 to 59"), condition(TRUE, "60+")) # Manipulate data final <- sdtm$DM %>% select(USUBJID, BRTHDTC, AGE) %>% mutate(AGEG = fapply(AGE, ageg)) %>% arrange(AGEG, AGE) %>% group_by(AGEG) %>% datastep(retain = list(SEQ = 0), calculate = {AGEM <- mean(AGE)}, attrib = list(USUBJID = dsattr(label = "Universal Subject ID"), BRTHDTC = dsattr(label = "Subject Birth Date", format = "%m %B %Y"), AGE = dsattr(label = "Subject Age in Years", justify = "center"), AGEG = dsattr(label = "Subject Age Group", justify = "left"), AGEB = dsattr(label = "Age Group Boundaries"), SEQ = dsattr(label = "Subject Age Group Sequence", justify = "center"), AGEM = dsattr(label = "Mean Subject Age", format = "%1.2f"), AGEMC = dsattr(label = "Subject Age Mean Category", format = c(B = "Below", A = "Above"), justify = "right")), { # Start and end of Age Groups if (first. & last.) AGEB <- "Start - End" else if (first.) AGEB <- "Start" else if (last.) AGEB <- "End" else AGEB <- "-" # Sequence within Age Groups if (first.) SEQ <- 1 else SEQ <- SEQ + 1 # Above or Below the mean age if (AGE > AGEM) AGEMC <- "A" else AGEMC <- "B" }) %>% ungroup() %>% put() # Put dictionary to log dictionary(final) %>% put() # Create Report ------------------------------------------------------------ sep("Create report") # Create table tbl <- create_table(final) # Create report rpt <- create_report(file.path(tmp, "./output/example1.rtf"), output_type = "RTF", font = "Arial") %>% titles("Our first SASSY report", bold = TRUE) %>% add_content(tbl) # write out the report res <- write_report(rpt) # Clean Up ----------------------------------------------------------------- sep("Clean Up") # Close the log log_close() # View Report # file.show(res$modified_path) # View Log # file.show(lf)
Here is the report produced by the sample program:
The above program produces the following log:
========================================================================= Log Path: C:/Users/dbosa/AppData/Local/Temp/Rtmpw1TuO2/log/example1.log Program Path: C:/packages/Testing/LogTest24.R Working Directory: C:/packages/Testing User Name: dbosa R Version: 4.4.2 (2024-10-31 ucrt) Machine: SOCRATES x86-64 Operating System: Windows 10 x64 build 26100 Base Packages: stats graphics grDevices utils datasets methods base Other Packages: tidylog_1.1.0 procs_1.0.7 reporter_1.4.4 libr_1.3.4 logr_1.3.9 fmtr_1.6.5 common_1.1.3 sassy_1.2.5 lubridate_1.9.3 forcats_1.0.0 stringr_1.5.1 dplyr_1.1.4 purrr_1.0.2 readr_2.1.5 tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.1 tidyverse_2.0.0 Log Start Time: 2025-03-26 12:50:40.218714 ========================================================================= > library(tidyverse) > library(sassy) > > options("logr.autolog" = TRUE) > > # Get temp location for log and report output > tmp <- tempdir() > > # Open the log > lf <- log_open(file.path(tmp, "example1.log")) > > # Send code to the log > log_code() > > sep("Load the data") > > # Get path to sample data > pkg <- system.file("extdata", package = "logr") > > # Define data library > libname(sdtm, pkg, "csv") > > # Prepare Data ------------------------------------------------------------- > sep("Prepare the data") > > # Define format for age groups > ageg <- value(condition(x > 18 & x <= 29, "18 to 29"), > condition(x >= 30 & x <= 44, "30 to 44"), > condition(x >= 45 & x <= 59, "45 to 59"), > condition(TRUE, "60+")) > > > # Manipulate data > final <- sdtm$DM %>% > select(USUBJID, BRTHDTC, AGE) %>% > mutate(AGEG = fapply(AGE, ageg)) %>% > arrange(AGEG, AGE) %>% > group_by(AGEG) %>% > datastep(retain = list(SEQ = 0), > calculate = {AGEM <- mean(AGE)}, > attrib = list(USUBJID = dsattr(label = "Universal Subject ID"), > BRTHDTC = dsattr(label = "Subject Birth Date", > format = "%m %B %Y"), > AGE = dsattr(label = "Subject Age in Years", > justify = "center"), > AGEG = dsattr(label = "Subject Age Group", > justify = "left"), > AGEB = dsattr(label = "Age Group Boundaries"), > SEQ = dsattr(label = "Subject Age Group Sequence", > justify = "center"), > AGEM = dsattr(label = "Mean Subject Age", > format = "%1.2f"), > AGEMC = dsattr(label = "Subject Age Mean Category", > format = c(B = "Below", A = "Above"), > justify = "right")), > { > > # Start and end of Age Groups > if (first. & last.) > AGEB <- "Start - End" > else if (first.) > AGEB <- "Start" > else if (last.) > AGEB <- "End" > else > AGEB <- "-" > > # Sequence within Age Groups > if (first.) > SEQ <- 1 > else > SEQ <- SEQ + 1 > > # Above or Below the mean age > if (AGE > AGEM) > AGEMC <- "A" > else > AGEMC <- "B" > > }) %>% > ungroup() %>% > put() > > # Put dictionary to log > dictionary(final) %>% put() > > # Create Report ------------------------------------------------------------ > sep("Create report") > > > # Create table > tbl <- create_table(final) > > # Create report > rpt <- create_report(file.path(tmp, "./output/example1.rtf"), > output_type = "RTF", font = "Arial") %>% > titles("Our first SASSY report", bold = TRUE) %>% > add_content(tbl) > > # write out the report > res <- write_report(rpt) > > > # Clean Up ----------------------------------------------------------------- > sep("Clean Up") > > # Close the log > log_close() > > # View Report > # file.show(res$modified_path) > > # View Log > # file.show(lf) > > > ========================================================================= Load the data ========================================================================= # library 'sdtm': 1 items - attributes: csv not loaded - path: C:/Users/dbosa/AppData/Local/R/win-library/4.4/logr/extdata - items: Name Extension Rows Cols Size LastModified 1 DM csv 87 24 45.8 Kb 2025-03-26 11:02:29 NOTE: Log Print Time: 2025-03-26 12:50:40.733955 NOTE: Elapsed Time: 0.511612892150879 secs ========================================================================= Prepare the data ========================================================================= # A user-defined format: 4 conditions Name Type Expression Label Order 1 obj U x > 18 & x <= 29 18 to 29 NA 2 obj U x >= 30 & x <= 44 30 to 44 NA 3 obj U x >= 45 & x <= 59 45 to 59 NA 4 obj U TRUE 60+ NA NOTE: Log Print Time: 2025-03-26 12:50:40.74675 NOTE: Elapsed Time: 0.0127952098846436 secs select: dropped 21 variables (STUDYID, DOMAIN, SUBJID, RFSTDTC, RFENDTC, …) NOTE: Log Print Time: 2025-03-26 12:50:40.759215 NOTE: Elapsed Time: 0.0124650001525879 secs mutate: new variable 'AGEG' (character) with 4 unique values and 0% NA NOTE: Log Print Time: 2025-03-26 12:50:40.779213 NOTE: Elapsed Time: 0.0199978351593018 secs group_by: one grouping variable (AGEG) NOTE: Log Print Time: 2025-03-26 12:50:40.79064 NOTE: Elapsed Time: 0.0114271640777588 secs datastep: columns increased from 4 to 8 NOTE: Log Print Time: 2025-03-26 12:50:40.911893 NOTE: Elapsed Time: 0.121252775192261 secs # A tibble: 87 × 8 # Groups: AGEG [4] USUBJID BRTHDTC AGE AGEG AGEM AGEB SEQ AGEMC <chr> <date> <dbl> <chr> <dbl> <chr> <dbl> <chr> 1 ABC-04-128 1987-05-24 19 18 to 29 49.4 Start 1 B 2 ABC-07-011 1985-01-18 21 18 to 29 49.4 - 2 B 3 ABC-09-139 1985-11-13 21 18 to 29 49.4 - 3 B 4 ABC-09-018 1984-08-29 22 18 to 29 49.4 - 4 B 5 ABC-04-074 1983-03-28 23 18 to 29 49.4 - 5 B 6 ABC-01-053 1980-04-07 26 18 to 29 49.4 - 6 B 7 ABC-06-070 1980-02-01 26 18 to 29 49.4 End 7 B 8 ABC-02-112 1976-11-01 30 30 to 44 49.4 Start 1 B 9 ABC-01-056 1975-05-02 31 30 to 44 49.4 - 2 B 10 ABC-03-089 1975-10-02 31 30 to 44 49.4 - 3 B # ℹ 77 more rows # ℹ Use `print(n = ...)` to see more rows NOTE: Data frame has 87 rows and 8 columns. NOTE: Log Print Time: 2025-03-26 12:50:40.993307 NOTE: Elapsed Time: 0.0814142227172852 secs ungroup: no grouping variables remain NOTE: Log Print Time: 2025-03-26 12:50:41.067702 NOTE: Elapsed Time: 0.0743949413299561 secs # A tibble: 87 × 8 USUBJID BRTHDTC AGE AGEG AGEM AGEB SEQ AGEMC <chr> <date> <dbl> <chr> <dbl> <chr> <dbl> <chr> 1 ABC-04-128 1987-05-24 19 18 to 29 49.4 Start 1 B 2 ABC-07-011 1985-01-18 21 18 to 29 49.4 - 2 B 3 ABC-09-139 1985-11-13 21 18 to 29 49.4 - 3 B 4 ABC-09-018 1984-08-29 22 18 to 29 49.4 - 4 B 5 ABC-04-074 1983-03-28 23 18 to 29 49.4 - 5 B 6 ABC-01-053 1980-04-07 26 18 to 29 49.4 - 6 B 7 ABC-06-070 1980-02-01 26 18 to 29 49.4 End 7 B 8 ABC-02-112 1976-11-01 30 30 to 44 49.4 Start 1 B 9 ABC-01-056 1975-05-02 31 30 to 44 49.4 - 2 B 10 ABC-03-089 1975-10-02 31 30 to 44 49.4 - 3 B # ℹ 77 more rows # ℹ Use `print(n = ...)` to see more rows NOTE: Data frame has 87 rows and 8 columns. NOTE: Log Print Time: 2025-03-26 12:50:41.219635 NOTE: Elapsed Time: 0.151932954788208 secs # A tibble: 8 × 11 Name Column Class Label Description Format Width Justify Rows NAs MaxChar <chr> <chr> <chr> <chr> <chr> <chr> <lgl> <chr> <int> <int> <int> 1 final USUBJID charact… Univ… <NA> <NA> NA <NA> 87 0 10 2 final BRTHDTC Date Subj… <NA> "%m %… NA <NA> 87 0 10 3 final AGE numeric Subj… <NA> <NA> NA center 87 0 2 4 final AGEG charact… Subj… <NA> <NA> NA left 87 0 8 5 final AGEM numeric Mean… <NA> "%1.2… NA <NA> 87 0 16 6 final AGEB charact… Age … <NA> <NA> NA <NA> 87 0 5 7 final SEQ numeric Subj… <NA> <NA> NA center 87 0 2 8 final AGEMC charact… Subj… <NA> "Belo… NA right 87 0 1 NOTE: Data frame has 8 rows and 11 columns. NOTE: Log Print Time: 2025-03-26 12:50:41.40138 NOTE: Elapsed Time: 0.181745052337646 secs ========================================================================= Create report ========================================================================= # A report specification: 3 pages - file_path: 'C:\Users\dbosa\AppData\Local\Temp\Rtmpw1TuO2/./output/example1.rtf' - output_type: RTF - units: inches - orientation: landscape - margins: top 0.5 bottom 0.5 left 1 right 1 - line size/count: 9/42 - title 1: 'Our first SASSY report' - content: # A table specification: - data: tibble 'final' 87 rows 8 cols - show_cols: all - use_attributes: all NOTE: Log Print Time: 2025-03-26 12:50:41.999186 NOTE: Elapsed Time: 0.597805976867676 secs ========================================================================= Clean Up ========================================================================= ========================================================================= Log End Time: 2025-03-26 12:50:42.151877 Log Elapsed Time: 0 00:00:01 =========================================================================
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.