macro 使用的基本形式是:
%macro macro-name;
sas code;
%mend macro-name;
macro 定义后的使用方式为:%macro-name
在宏中加入宏变量的方式如下:
%macro macro-name(parameter-1=,parameter-2=,.......);举例如下:
定义宏:%macro quarterlyreport(quarter=,salesrep=);
使用宏:%quarterlyreport(quarter=3,salerep=smith);SAS解码宏的时候则会把宏变量用值代替;
使用宏语句如%IF 或者%DO 来增加宏的灵活度,其使用形式如下:
%IF condition %THEN action;
%ELSE %IF condition %THEN action;
%ELSE action;
%IF condition %THEN %DO;
SAS 语句;
%END;
值得注意的是这些宏语句只能在宏内部使用;经过SAS解码后的标准SAS程度不会含有%IF等这些宏语句,这些宏语句的存在更多是为了区分执行哪些相应的SAS步;举例如下:
%IF &SYSDAY=Tuesday %THEN %LET country=Belgium;
%ELSE %LET country=France;
通常我们使用SAS宏的话,SAS会先解码宏生成标准的SAScode,再编译这些SAScode最后执行;但是只有执行到最后一个阶段,SAS才能得到数据值;我们可以使用call symput命令来解决这个问题,可以在数据步实现读取值并生成宏变量,将某个具体值赋值给宏变量的使用形式如下:
call symput("macro-variable-name",value);但必须明确一个宏变量只能存放一个值
引号内的是宏变量名,value可以是变量名,SAS会将该变量的值赋给宏变量,也可以是用引号引用的常值,但我们在data步使用call symput 后却不能在该步使用新生成宏变量,因为只有该data步执行后才会生成宏变量;
将常值赋值给宏变量名举例如下:
IF age>=18 then call symput("status","adult");
else call symput("status","minor");
将变量名赋值给宏变量举例如下:
if TotalSales>1000000 then call symput("bestseller",booktitle);
举例如下:
proc sort data=flowersales;
by descending saleamount;
run;
data _null_;
set flowersales;
if _n_=1 then call symput("selectedcustomer",customerid);(把customerid 变量第一行的值赋给selectedcustomer宏变量)
else stop;
run;
proc print data=flowersales;
where customerid="&selectedcustomer";
format saledate worddate18. saleamount dollar7.;
title "Customer &selectedcustomer Had the Single Largest Order"';
run;
只有在双引号内的宏变量SAS才会解码;单引号内的宏变量SAS不会解码:
原始程序 解码后程序
title ‘Report for &month’ title ‘Report for &month’
title "Report for &month" title "Report for january"
以下是编写SAS宏时帮助查找宏错误的或者警告的系统选项:
MERROR(默认) | NOMERROR 当没有找到宏时会在日志报warning
SERROR (默认) | SERROR 当没有找到宏变量时会在日志报warning
MLOGIC | NOMLOGIC(默认) 把执行宏的过程在日志打印出来
MPRINT | NOMPRINT(默认) 把宏解码生成标准SAS程序在日志打印出来
SYMBOLGEN | NOSYMBOLGEN(默认)把宏变量的值在日志中打印出来
使用方式如下:
options MPRINT NOSYMBOGEN NOMLOGIC;