Here is an example of a simple listing using the sassy system of functions. The data used for these examples is included in the sassy package, and can be retrieved using the system.file() function as shown below.

Program

Note the following about this example:

  • The logr package provides a simple, convenient logging mechanism.
  • The sep() function creates a nice separator in the log to help keep it organized and readable.
  • The put() function will write anything you want to the log, similar to a SAS® %put() statement.
  • The libname() function from the libr package loads an entire directory of data files, just like a SAS® libname statement.
  • The lib_load() function loads the data into the workspace for easy access, and gives you a two-level (<library>.<dataset>) dataset reference like SAS®.
  • The reporter package will set column widths, page wraps, and page breaks automatically.
library(sassy)

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

# Get path to temp directory
tmp <- tempdir() 

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

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

sep("Get Data")

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

sep("Write Report")

# Define table object
tbl <- create_table(sdtm$DM) |> 
  define(USUBJID, id_var = TRUE)

# Construct report path
pth <- file.path(tmp, "output/l_dm.rtf") 

# Define report object
rpt <- create_report(pth, output_type = "RTF", font = "Courier") |> 
  page_header("Sponsor: Company", "Study: ABC") |> 
  titles("Listing 1.0", "SDTM Demographics") |> 
  add_content(tbl, align = "left") |> 
  page_footer(Sys.time(), "CONFIDENTIAL", "Page [pg] of [tpg]")

# Write report to file system
write_report(rpt) 

# Close log
log_close()

# View report
# file.show(pth)

# View log
# file.show(lgpth)

Output

Here is an image of the first page of the RTF report produced by the above listing example:

Log

Here is the log produced by the above listing example:

========================================================================= 
Log Path: C:/Users/User/AppData/Local/Temp/Rtmpum5T6o/log/example1.log 
Working Directory: C:/packages/Testing 
User Name: User 
R Version: 4.0.3 (2020-10-10) 
Machine: DESKTOP-1F27OR8 x86-64 
Operating System: Windows 10 x64 build 18363 
Log Start Time: 2021-01-05 08:05:09 
========================================================================= 

========================================================================= 
Get Data 
========================================================================= 

# library 'sdtm': 8 items
- attributes: csv not loaded
- path: C:/Users/User/Documents/R/win-library/4.0/sassy/extdata
- items:
  Name Extension Rows Cols     Size        LastModified
1   AE       csv  150   27  88.1 Kb 2020-12-27 23:21:55
2   DA       csv 3587   18 527.8 Kb 2020-12-27 23:21:55
3   DM       csv   87   24  45.2 Kb 2020-12-27 23:21:55
4   DS       csv  174    9  33.7 Kb 2020-12-27 23:21:55
5   EX       csv   84   11    26 Kb 2020-12-27 23:21:55
6   IE       csv    2   14    13 Kb 2020-12-27 23:21:55
7   SV       csv  685   10  69.9 Kb 2020-12-27 23:21:55
8   VS       csv 3358   17   467 Kb 2020-12-27 23:21:55

========================================================================= 
Write Report 
========================================================================= 

# A report specification: 9 pages
- file_path: 'C:\Users\User\AppData\Local\Temp\Rtmpum5T6o/output/l_dm.rtf'
- output_type: RTF
- units: inches
- orientation: landscape
- line size/count: 108/48
- page_header: left=Sponsor: Company right=Study: ABC
- title 1: 'Listing 1.0'
- title 2: 'SDTM Demographics'
- page_footer: left=2021-01-05 08:05:14 center=CONFIDENTIAL right=Page [pg] of [tpg]
- content: 
# A table specification:
- data: tibble 'sdtm.DM' 87 rows 24 cols
- show_cols: all
- use_attributes: all
- define: USUBJID id_var='TRUE' 

========================================================================= 
Log End Time: 2021-01-05 08:05:17 
Log Elapsed Time: 0 00:00:07 
========================================================================= 

Next: Example 2: Demographics Table