The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
The sassy system of functions also supports reports with graphics. Plots from the popular ggplot2 package can be added to a report. The following example illustrates such a report.
Note the following about this example:
create_plot()
function.add_content()
function, just like the tables in the
previous examples.library(ggplot2)
library(sassy)
# Prepare Log -------------------------------------------------------------
options("logr.autolog" = TRUE,
"logr.notes" = FALSE)
# Get path to temp directory
tmp <- tempdir()
# Get sample data directory
dir <- system.file("extdata", package = "sassy")
# Open log
lgpth <- log_open(file.path(tmp, "example3.log"))
# Load and Prepare Data ---------------------------------------------------
sep("Prepare Data")
# Define data library
libname(sdtm, dir, "csv")
put("Prepare format")
agefmt <- value(condition(x >= 18 & x <= 24, "18 to 24"),
condition(x >= 25 & x <= 44, "25 to 44"),
condition(x >= 45 & x <= 64, "45 to 64"),
condition(x >= 65, ">= 65"))
put("Prepare data")
datastep(sdtm$DM, keep = v(USUBJID, SEX, AGE, ARM, AGECAT),
where = expression(ARM != "SCREEN FAILURE"),
{
AGECAT <- fapply(AGE, agefmt)
}) -> dm_mod
put("Get population counts")
proc_freq(dm_mod, tables = ARM,
options = v(nonobs, nopercent)) -> arm_pop
proc_freq(dm_mod, tables = SEX,
options = v(nonobs, nopercent)) -> sex_pop
proc_freq(dm_mod, tables = AGECAT,
options = v(nonobs, nopercent)) -> agecat_pop
put("Convert agecat to factor so rows will sort correctly")
agecat_pop$CAT <- factor(agecat_pop$CAT, levels = levels(agefmt))
put("Sort agecat")
agecat_pop <- proc_sort(agecat_pop, by = CAT)
# Create Plots ------------------------------------------------------------
plt1 <- ggplot(data = arm_pop, aes(x = CAT, y = CNT)) +
geom_col(fill = "#0000A0") +
geom_text(aes(label = CNT), vjust = 1.5, colour = "white") +
labs(x = "Treatment Group", y = "Number of Subjects (n)")
plt2 <- ggplot(data = sex_pop, aes(x = CAT, y = CNT)) +
geom_col(fill = "#00A000") +
geom_text(aes(label = CNT), vjust = 1.5, colour = "white") +
labs(x = "Biological Sex", y = "Number of Subjects (n)")
plt3 <- ggplot(data = agecat_pop, aes(x = CAT, y = CNT)) +
geom_col(fill = "#A00000") +
geom_text(aes(label = CNT), vjust = 1.5, colour = "white") +
labs(x = "Age Categories", y = "Number of Subjects (n)")
# Report ------------------------------------------------------------------
sep("Create and print report")
pth <- file.path(tmp, "output/example3.rtf")
page1 <- create_plot(plt1, 4.5, 7) |>
titles("Figure 1.1", "Distribution of Subjects by Treatment Group",
bold = TRUE, font_size = 11)
page2 <- create_plot(plt2, 4.5, 7) |>
titles("Figure 1.2", "Distribution of Subjects by Biological Sex",
bold = TRUE, font_size = 11)
page3 <- create_plot(plt3, 4.5, 7) |>
titles("Figure 1.2", "Distribution of Subjects by Age Category",
bold = TRUE, font_size = 11)
rpt <- create_report(pth, 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]")
write_report(rpt)
# Clean Up ----------------------------------------------------------------
# Close log
log_close()
# View files
# file.show(pth)
# file.show(lgpth)
Here are the three pages of the report:
Here is the log for the above program:
=========================================================================
Log Path: C:/Users/dbosa/AppData/Local/Temp/Rtmpo1naKK/log/example3.log
Program Path: C:/packages/Testing/procs/ProcsFigs.R
Working Directory: C:/packages/Testing/procs
User Name: dbosa
R Version: 4.3.1 (2023-06-16 ucrt)
Machine: SOCRATES x86-64
Operating System: Windows 10 x64 build 22621
Base Packages: stats graphics grDevices utils datasets methods base Other
Packages: tidylog_1.0.2 ggplot2_3.4.2 procs_1.0.3 reporter_1.4.1 libr_1.2.8
fmtr_1.5.9 logr_1.3.4 common_1.0.8 sassy_1.1.0
Log Start Time: 2023-09-06 18:32:28.438427
=========================================================================
=========================================================================
Prepare Data
=========================================================================
# library 'sdtm': 7 items
- attributes: csv not loaded
- path: C:/Users/dbosa/AppData/Local/R/win-library/4.3/sassy/extdata
- items:
Name Extension Rows Cols Size LastModified
1 AE csv 150 27 88.5 Kb 2023-08-07 17:51:40
2 DM csv 87 24 45.5 Kb 2023-08-07 17:51:40
3 DS csv 174 9 34.1 Kb 2023-08-07 17:51:40
4 EX csv 84 11 26.4 Kb 2023-08-07 17:51:40
5 IE csv 2 14 13.4 Kb 2023-08-07 17:51:40
6 SV csv 685 10 70.3 Kb 2023-08-07 17:51:40
7 VS csv 3358 17 467.4 Kb 2023-08-07 17:51:40
Prepare format
# A user-defined format: 4 conditions
Name Type Expression Label Order
1 obj U x >= 18 & x <= 24 18 to 24 NA
2 obj U x >= 25 & x <= 44 25 to 44 NA
3 obj U x >= 45 & x <= 64 45 to 64 NA
4 obj U x >= 65 >= 65 NA
Prepare data
datastep: columns decreased from 24 to 5
# A tibble: 85 × 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
# ℹ 75 more rows
# ℹ Use `print(n = ...)` to see more rows
Get population counts
proc_freq: input data set 85 rows and 5 columns
tables: ARM
view: TRUE
output: 1 datasets
# A tibble: 4 × 3
VAR CAT CNT
<chr> <chr> <dbl>
1 ARM ARM A 20
2 ARM ARM B 21
3 ARM ARM C 21
4 ARM ARM D 23
proc_freq: input data set 85 rows and 5 columns
tables: SEX
view: TRUE
output: 1 datasets
# A tibble: 2 × 3
VAR CAT CNT
<chr> <chr> <dbl>
1 SEX F 32
2 SEX M 53
proc_freq: input data set 85 rows and 5 columns
tables: AGECAT
view: TRUE
output: 1 datasets
# A tibble: 4 × 3
VAR CAT CNT
<chr> <chr> <dbl>
1 AGECAT >= 65 13
2 AGECAT 18 to 24 5
3 AGECAT 25 to 44 23
4 AGECAT 45 to 64 44
Convert agecat to factor so rows will sort correctly
Sort agecat
proc_sort: input data set 4 rows and 3 columns
by: CAT
keep: VAR CAT CNT
order: a
output data set 4 rows and 3 columns
# A tibble: 4 × 3
VAR CAT CNT
<chr> <fct> <dbl>
1 AGECAT 18 to 24 5
2 AGECAT 25 to 44 23
3 AGECAT 45 to 64 44
4 AGECAT >= 65 13
=========================================================================
Create and print report
=========================================================================
# A report specification: 3 pages
- file_path: 'C:\Users\dbosa\AppData\Local\Temp\Rtmpo1naKK/output/example3.rtf'
- output_type: RTF
- units: inches
- orientation: landscape
- margins: top 1 bottom 1 left 1 right 1
- line size/count: 9/36
- page_header: left=Sponsor: Company right=Study: ABC
- footnote 1: 'Program: DM_Figure.R'
- page_footer: left=Date Produced: 06Sep23 18:32 center= right=Page [pg] of [tpg]
- content:
# A plot specification:
- data: 4 rows, 3 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, 3 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, 3 cols
- layers: 2
- height: 4.5
- width: 7
- title 1: 'Figure 1.2'
- title 2: 'Distribution of Subjects by Age Category'
lib_sync: synchronized data in library 'sdtm'
=========================================================================
Log End Time: 2023-09-06 18:32:32.220485
Log Elapsed Time: 0 00:00:03
=========================================================================
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.