# RSP: A Brief Introduction by Henrik Bengtsson, 2020-07-09 Available on
CRAN
since 2005 (first version ~2002): ```r install.packages("R.rsp") ``` ```r > library("R.rsp") > rcat("A random number: <%= sample(1:10, size = 1) %>") A random number: 7 ``` --- # Objectives * Dynamically generate documents and reports (and web/help pages). * Quickly turn your favorite static report template into a dynamic one. * Support _all_ formats, e.g. LaTeX, Markdown, HTML, ... * Supplement and/or complement Sweave, knitr, ... * Mix and match code and text however you want. * Simplify sharing of template and output documents. * Use for R package vignettes. ## Some usage * PSCBS: PDF reports of copy-number segmentation results * aroma-project.org: Interactive [Chromosome Explorer](http://aroma-project.org/data/reports/GSE8605/ACC,-XY,BPN,-XY,AVG,FLN,-XY,paired/ChromosomeExplorer.html) and [Array Explorer](http://www.aroma-project.org/data/reports/GSE8605/raw/ArrayExplorer.html) --- # Compiling RSP document into PDF, HTML, ... ```r > rfile("http://example.org/vignette.tex.rsp") RspFileProduct: Pathname: vignette.pdf File size: 258.71 kB (264925 bytes) Content type: application/pdf Metadata 'title': 'Dynamic document creation using RSP' Metadata 'keywords': 'Literate programming, HTML, PDF' Metadata 'author': 'Henrik Bengtsson' ``` --- # Very simple idea: Translate RSP to R and evaluate ## 1. RSP document ``` Title: Example Counting:<% for (i in 1:3) { %> <%= i %> <% } %> ``` ## 2. R script ```r cat("Title: Example\nCounting:") for (i in 1:3) { cat(" ") cat(i) } ``` ## 3. RSP output ``` Title: Example Counting: 1 2 3 ``` --- # RSP Markup Language ## 1. RSP comments (`<%-- ... --%>`) ## 2. RSP preprocessing directives (`<%@ ... %>`) ## 3. RSP code expressions (`<% ... %>`) --- # RSP Markup Language ## 1. RSP comments (`<%-- ... --%>`) ``` <%----------------------------- Compile to PDF: R.rsp::rfile("report.tex.rsp") ------------------------------%> \documentclass{report} ... ``` RSP comments drop anything within, e.g. private notes, other RSP constructor (nested comments too) and will never be part of the output. --- # RSP Markup Language ## 2. RSP preprocessing directives (`<%@ ... %>`) ### Including local and online files ``` <%@include file="http://example.org/QC.tex.rsp"%> ``` ### Conditional inclusion ``` <%@ifeq version="devel"%> <%@include file="templates/QA-devel.tex.rsp"%> <%@else%> Quality assessment is still under development. <%@endif%> ``` ### Meta data ``` <%@meta title="Example"%> \hypersetup{pdftitle=<%@meta name="title"%>} \title{<%@meta name="title"%>} ``` RSP preprocessing directives are independent of R, i.e. they would look the same with RSP for Python. --- # RSP Markup Language ## 3. RSP code expressions (`<% ... %>`) ### Insert value of evaluated R expressions ``` <%= sample(1:100, size = 1) %> ```
### Code snippets - mixture of RSP and text ``` <% for (i in 1:3) { %> Step <%= i %>. <% } %> ``` --- # Looping over mixtures of code and text ``` <% fit <- segmentByPairedPSCBS(data) %> \section{Segmentation results} <% for (chr in 1:23) { %> \subsection{Chromosome <%= chr %>} <% fitT <- extractChromosome(fit, chr) %> PSCBS identified <%= nbrOfSegments(fitT) %> segments on Chr. <%= chr %>. ... <% } # for (chr ...) %> ```
To achieve the same using noweb-style markup (e.g. Sweave and knitr) is tedious. --- # RSP template functions ``` <%-- RSP TEMPLATES --%> <% chromosomeSummary <- function(chr) { %> <% fitT <- extractChromosome(fit, chr) %> PSCBS identified <%= nbrOfSegments(fitT) %> segments on Chr. <%= chr %>. ... <% } %> <%-- DOCUMENT --%> ... <% for (chr in 1:23) { %> \subsection{Chromosome <%= chr %>} <% chromosomeSummary(chr) %> <% } # for (chr ...) %> ``` --- # R.rsp package - RSP engine for R ## rcat() - RSP version of cat() ```r > rcat("A random integer in [1,100]: <%=sample(1:100, size = 1)%>\n") A random integer in [1,100]: 77 ```
## rsource() - RSP version of source() Consider RSP file 'count.rsp' (think 'count.R'): ``` Counting:<% for (i in 1:10) { %> <% Sys.sleep(0.3) %><%= i %> <% } %>. ``` Running this RSP script gives: ```r > rsource("count.rsp") Counting: 1 2 3 4 5 6 7 8 9 10. ``` --- # rfile() - end-to-end compilation ```r > rfile("report.md.rsp", args = list(n = 50, model = "L1")) RspFileProduct: Pathname: report.html File size: 42.54 kB (43564 bytes) Content type: text/html ```
```r > rfile("http://example.org/vignette.tex.rsp") RspFileProduct: Pathname: vignette.pdf File size: 258.71 kB (264925 bytes) Content type: application/pdf Metadata 'title': 'Dynamic document creation using RSP' Metadata 'keywords': 'Literate programming, HTML, PDF' Metadata 'author': 'Henrik Bengtsson' ``` --- # Including graphics (R.devices package) RSP-embedded LaTeX ``` \includegraphics{<%= toPDF("MyFigure,yeah,cool", { curve(dnorm, from = -5, to = +5) }) %>} ``` generates the image file and outputs ``` \includegraphics{MyFigure,yeah,cool} ``` which appears as
--- # Appendix Session info: ``` R version 4.1.2 (2021-11-01) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu Jammy Jellyfish (development branch) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0 locale: [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8 [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] R.devices_2.17.0 R.rsp_0.44.0 R.oo_1.24.0 R.methodsS3_1.8.1 loaded via a namespace (and not attached): [1] compiler_4.1.2 markdown_1.1 tools_4.1.2 base64enc_0.1-3 [5] xfun_0.28 digest_0.6.29 R.cache_0.15.0 R.utils_2.11.0 ``` These slides were generated using `R.rsp::rfile()` in 0.11 secs.