SAS宏语言主要用于实现代码的重复利用、完成复杂的逻辑判断和条件控制,使得代码更为简短清晰,程序更加灵活及易于维护。
宏工具的功能非常强大,使用宏工具来完成以下任务。
- 使用宏变量实现文本替代;
- 使用宏产生程序语句;
- 使用宏循环及条件判断语句完成程序交互。
SAS宏语言实际是上一种文本语言,在宏语言中所有变量的值都只能是字符。宏语言的特征之一就是带有符号”&“和”%“,前者一般与宏变量一起使用,后者一般常与宏一起使用。
举例:
data orsales2001;
set sashelp.orsales;
if year=2002;
run;
proc print data =orsales2001;
title "orsales2001";
footnote1 "created 23:21 19/7/2019";
footnote2 "on the WIN system Using SAS 9.4";
run;
以上代码虽然实现目标,但是不易维护,主要体现在以下两个方面:
年份需要用户手动输入(if year=2002);
上述代码中2001出现3次,假设想要看到其他年份的数据,只能在程序中将所有出现年份2001都做替换。
使用宏语言改写上述代码:
%let year=2001;
data orsales&year;
set sashelp.orsales;
if year=&year;
run;
proc print data =orsales&year;
title "orsaless&year";
footnote1 "created &systime &sysdate &sysdate9";
footnote2 "on the &sysscp system Using &sysver";
run;
- 定义宏变量year,赋值2001;
- 脚注footnote利用&systime、&sysdate、&sysdate9、&sysver等系统宏变量,自动生成时间,避免手工输入。
- 例中,在引号内引用宏变量的值时必须用双引号。因为宏处理器只能在双引号内进行替代。
以下所用数据集:ResDat.class
ResDat.stk000002
- 引用宏变量
- 宏变量的定义方法主要有以下3种方法:
- 使用%let语句;
- 在DATA步种定义宏变量;
- 在sql语言中定义宏变量。
直接调用方法:&宏变量。注意:单引号内的宏变量不会被解析,双引号才会被解析。
间接调用方法:通过多个“&”符号来实现。
宏处理器对多个“&”的处理规则是:从左到右进行扫描,若宏变量前仅含有一个“&”,则解析该宏变量,否则将相邻两个&替换成一个&,重复上述扫描过程。
例1 引用宏变量A
%let a=ResDat.class;
data a;
set &a ;
run;
/*上段程序等价于:
data a;
set ResDat.class;
run;
在带有引号的文本中引用宏变量时,需要将这个文本字符串用双引号括起来。
*/
- 宏处理器只能在双引号内进行替代。
例16.2:宏处理器只能在双引号内进行替代
%let a=january;
data;
put "This is the time series plot for &A";
run;
- 多次引用宏变量
/*例16.3 多次引用宏变量。*/
%let a=ResDat.class;
data male;
set &a ;
if sex='M';
proc print;
title "subset of &a";
data female;
set &a ;
if sex