One of my students emailed me, asking how to easily reset SAS system options. He was looking for a one-liner solution, just like you get with graphic options:
GOPTIONS RESET;
While there isn't a RESET keyword for the OPTIONS statement, you can save your options settings before making changes using PROC OPTSAVE, and then easily restore the original values using PROC OPTLOAD. However, as the student pointed out, that's all well and good if you remembered to save your options before you made changes, but what do you do if the changes have already been made and you really don't want to re-start your SAS? So I rooted around in the SAS functions list, and discovered GETOPTION(), a little-known gem that should enable me to write my own OptionReset macro. I experimented with a little demo code to see how it worked:
options ls=80 PS=18; data _null_; length option $1024; option=getoption("linesize",'keyword','startupvalue'); putlog "NOTE: at startup: " option; option=getoption("linesize",'keyword'); putlog "NOTE: currently: " option; run; SAS LOG: NOTE: at startup: LINESIZE=100 NOTE: currently: LINESIZE=80 |
That was interesting! Now, to modify the DATA step to build and execute the OPTIONS statement that would re-set the option to its original value. I tried this:
options ls=80 PS=18; data _null_; length statement $1500; statement =cat('OPTIONS ',getoption("linesize",'keyword','startupvalue'),';'); putlog "NOTE: Resetting system option: " statement ; call execute(statement ); run; SAS LOG: NOTE: Resetting system option: OPTIONS LINESIZE=100; |
After re-running the original data step, I could see that my option had been reset!
NOTE: at startup: LINESIZE=100 NOTE: currently: LINESIZE=100
Next, I added a SET SASHELP.VMACRO statement to leverage the dictionary table view, working through all of the appropriate options. We'll exclude the options reserved for SAS invocation...
options ls=80 PS=18; data _null_; length statement startup current $1024; set sashelp.voption; /* Exclude options you can't change while SAS is executing */ where optstart ne 'startup' and optname not in ('AWSDEF','FONT'); startup=getoption(optname,'startupvalue'); current=getoption(optname); if startup ne current then do; PUTLOG "NOTE: OptionReset Macro Resetting " optname " from " current " to " startup "."; statement =cat('OPTIONS ',getoption(optname,'keyword,startupvalue'),';'); call execute(statement ); end; run; SAS LOG: NOTE: OptionReset Macro Resetting LINESIZE from 80 to 100 . NOTE: OptionReset Macro Resetting PAGESIZE from 18 to 21 . ... NOTE: CALL EXECUTE generated line. 1 + OPTIONS LINESIZE=100; 2 + OPTIONS PAGESIZE=21; |
With a little extra work, I wrapped this in a parameterized macro, allowing me to choose an indivdual option to rest, or to reset them all. The macro is in the ZIP file for this blog. After compiling the macro (OptionReset.sas) submit:
%OptionReset(!HELP)
to see syntax help in the SAS log.
I keep a copy of this macro in my AUTOCALL path and can call it whenever I want to reset a SAS system option to the start-up value.
Until next time, may the SAS be with you!
Mark
6 Comments
Hi Jedi,can you explain me why we need to place option name in quotation marks,while syntax mentioned in help and documentation doesnt show any usage of quotation marks...???Even i wrote a code for testing this option which only works when quotation marks are included like this
data _null_;
opt=getoption("linesize","keyword");
put opt=;
run;
If i exclude that quotation marks,
Getting errors saying numeric values has converted to character values.
Hey, Bhargav! In DATA step programming, all text literals must be delimited by quotes - either "text" or 'text'. Without the quotes, the complier will interpret the text as a variable name. So if you tried this:
data _null_;
opt=getoption(linesize,keyword);
put opt=;
run;
you get an error. You CAN use variables to hold the text values for the getoptions function, so this code will work:
data _null_;
ls='linesize';
kw='keyword';
opt=getoption(ls,kw);
put opt=;
run;
Regards,
Mark
I'm a co-founder of the brazilian website http://www.estatisti.co/ , focused on sharing news, articles and interviews related to Statistics and I'd like to have the honor to have you interviewed by us!
We are 3 young entrepreneurs that are majoring in Statistics and we'd like to contribute to other students in this area with edifying information from professionals working with statistics, their experiences and opinions.
If you accept, could you send us your email so we can give you the questions, please?
Best Regards,
João Victor
Eu tenho experiençia minimo com estatística, mas seria um prazer ser entrevistado para o seu site. Meu e-mail: mark.jordan @ sas.com.
Cordialmente,
Mark
That's cute. As a macro programmer, I use GETOPTION() a lot to store a user's setting of some option and then restore it at the end (to avoid an unwanted side-effect of having a macro change the user's environment), but hadn't thought about using that STARTUPVALUE argument for a global reset. Nifty.
:-) Thanks!
Mark