10 SpinSAS
spinsas
is an alternative way of processing dynamic Markdown
from a SAS command file. In this form, documents are written
within the comments of a SAS file. This enables you to
run the same file within SAS (to simply execute the commands) and
through knitr
(to produce Markdown and HTML files).
This is particularly useful if you already have a number of *.sas files to which you'd like to add a little text to produce a document.
10.1 Special Markup
Within your SAS command file (*.sas), you use the following symbols to denote plain Markdown text, SAS code chunks, R code chunks, and text to be dropped from the document.
Notice that SAS will treat all of these as comments.
- “**”, a double asterisk, signals the beginning of document text.
End with a semi-colon, “;” at the end of a line. - “*+ “, an asterisk-plus, signals the beginning of a code chunk, and specifies the code chunk options. End with a semi-colon.
- “*R “, an asterisk-R, signals the enclosed code is in R. End with a semi-colon.
- “/**”, comments to “spin” begin with slash-double-asterisk. These do not show up in your document. End with “/” at the end of a line.
10.2 Semi-colons
- No semi-colons at the ends of lines in your document text.
- Your chunk of SAS code must end with a semi-colon (not a block comment).
10.3 Example
In order to run SAS code, first we load the SASmarkdown
library so it can automatically set up some necessary options in R.
*+ setup, message=FALSE ;
*R
library(SASmarkdown)
;
Text is then included as a special comment.
** The report begins here.;
Finally, the executable SAS code is given a line of chunk instructions.
*+ example1, engine='sas', comment=NA;
proc means data=sashelp.class /*(keep = age)*/;
run;
/* lines here are
ignored by SAS. If at the end of
your SAS code chunk they must be followed by a semi-colon.
*/
;
You can use the usual Markdown within the text sections.
The entire document might be:
*+ setup, message=FALSE ;
*R
library(SASmarkdown)
;
** The report begins here.;
*+ example1, engine='sas', comment=NA;
proc means data=sashelp.class /*(keep = age)*/;
run;
10.4 Processing
Set up an example file to use:
indoc <- "
*+ setup, message=FALSE ;
*R
library(SASmarkdown)
;
** The report begins here.;
*+ example1, engine='sas', comment=NA;
proc means data=sashelp.class /*(keep = age)*/;
run;
"
writeLines(indoc, "indoc.sas")
To process this document then, simply use
library(SASmarkdown)
spinsas("indoc.sas")
Which gives a document, "indoc.html" that looks like the following:
library(SASmarkdown)
The report begins here.
proc means data=sashelp.class /*(keep = age)*/;
run;
The MEANS Procedure
Variable N Mean Std Dev Minimum Maximum
-------------------------------------------------------------------------
Age 19 13.3157895 1.4926722 11.0000000 16.0000000
Height 19 62.3368421 5.1270752 51.3000000 72.0000000
Weight 19 100.0263158 22.7739335 50.5000000 150.0000000
-------------------------------------------------------------------------
Written using
- SASmarkdown version 0.8.0.
- knitr version 1.40.
- R version 4.2.2 (2022-10-31 ucrt).