宏参数被用来传递传递值或者文本字符串给宏,能让你不用%let就能定义宏变量。
宏参数有两种类型:一种是positional parameter,另一种是keyword(named) parameter。
一:位置参数(positional parameter)
位置参数的名称来源于这样一个事实:即它们是使用%Macro语句上的特定位置来定义的。当调用宏时,该值将通过宏调用中与宏定义中相同的对应位置传递.位置参数比关键词参数有一点点好处,只是少一点点内存。
%macro look(dsn,obs);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;
在调用带有参数的宏时,在宏名称后面是一个用逗号分隔的参数值列表,这些参数值由圆括号括起来。
比如下面这样
%look(sashelp.cars,10)
你不必给所有的位置参数一个值,比如下面这样,但是不一定会产生可用的代码
%look() ---报错
%look(sashelp.cars) ---报错
%look(,10)---报错
比如我们调用这个%look(,10),对于为空的参数,SAS会解析成空字符串(null string),所以%look(,10)会解析成
title "data set ";
proc contents data=;
run;
title2 "first 10 observations";
proc print data= (obs=10);
run;
这段程序包含语法错误,所以肯定会报错,也不会运行。
二:关键词参数(keyword parameter)
关键词参数可以用在任何位置,也可以设置默认的值。形式是有一个等于号。
%macro look(dsn=,obs=);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;
%look(obs=10,dsn=sashelp.cars)
注意到在宏里面是我是把宏参数dsn放在前面,但是调用的时候我给他们换了一下位置,这样是不会报错的,但是还是建议按顺序来。
如果你需要多次调用一个宏,且某个宏参数的值不变的话,你可以直接在宏里面提前把值写上,比如这样:
%macro look(dsn=sashelp.cars,obs=);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;
%look(obs=10)
%look(obs=15)
%look(obs=20)
%look(dsn=sashelp.class,obs=5);/这时候会替换成class数据集/
需要注意的是,如果你的位置参数和关键词参数用法混用的话,要严格按照所列的顺序赋值,下面这段程序肯定会报错
%macro look(dsn,obs=);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;
%look(obs=10,sashelp.cars)
上面就是关于宏参数需要注意的一些点,当然还有一些好的编程习惯,假设你的宏里面宏参数有很多个:
1)将横向结构转换成纵向结构
2)参数能简要描述输入的内容
3)当多次调用宏都是用默认值的时候,可以把默认值放到宏参数中
4)对每一个参数最好有对应的注释。
%look(dsn=,
var1=Y,
var2=,
var3=N,
obs=,
dsout=);
/******************************************
dsn:输入数据集
var1:XXXXXXXXXXX;
var2:XXXXXXXXXXX;
var3:XXXXXXXXXXX;
obs:XXXXXXXXXXX;
dsout:输出数据集;
*******************************************/