SAS宏的执行逻辑是先将宏语句(macro statement) 传递给宏处理器(macro processor)对宏语句进行解码,生成标准的SAS程序(SAS code),然后SAS对解码后的SAS程序进行编译和执行。
SAS宏包括两部分:宏名称和宏变量名,宏名称以%为前缀,宏变量名以&为前缀,宏变量名与标准的SAS变量类似,但是只含有一个值,且该值的储存形式的字符,变量名、数字、文本等都可以成为宏变量的值;
宏变量有局部宏变量和全局宏变量,定义在宏内部的宏变量为局部宏变量,定义在宏外部的变量为全局宏变量;在使用宏之前必须提前打开宏选项,SAS默认是打开的,也可以下面命令来查看宏选项是否打开:
proc options option=macro;
run;
比较好用的写SAS宏的方式:明确分段撰写宏程序,首先撰写标准的SAS程序,如果跑通无误,则可以一次修改一个特征将该段程序变成SAS宏语言。
值得注意的是:%INCLUDE,%LIST,%RUN 语句不是SAS宏名称。
SAS宏处理解码宏变量时会将宏变量替换成宏变量的值放入SAS程序。以下是定义宏变量的几种方式:
%let macro-variable-name=value(宏变量与标准SAS变量一样不超过32字符,以字母或_开头,含字母、数字和下划线),比如:
%let iterations=10;
%let country=New Zealand;
值得注意的是宏变量的值即使是字符也不需要引号,SAS会自动把= 和;之间的内容作为宏变量的值,但是会去除收尾的空格;
宏变量的使用是在宏变量名称前加上&前缀;如:
DO i=1 to &iterations;
TITLE "Address in &country";
SAS宏处理器解码后如下:
DO i=1 to 10;
TITLE "Address in New Zealand";(SAS必须是双引号才能在引号内引用宏)
宏变量与普通文本可以连接在一起,SAS也只会对&后至空格\"."\";"前的内容识别为宏变量名,如果普通文本在宏变量前面则可以直接连接,如果普通文本在宏变量后面则需要在两者之间加“.”;如下所示:
%let region=west;
%let myname=sam;
解码前 解码后:
office="NorthAmerican®ion": office="NorthAmericanwest";
office="®ion.coast": office="westcoast";
data &myname..sales; data sam.sales;
data &myname®ion.ern_sales; data samwestern_sales;
启动SAS后,SAS宏处理器会自动创建一些宏变量,比如:
&sysdate sas启动日期
&sysday sas启动日(如:周一)
&sysnobs 最近一个sas数据集的观测数