257:macro base(五)---宏参数

2023-07-31  本文已影响0人  SASPRO的打工人生活

宏参数被用来传递传递值或者文本字符串给宏,能让你不用%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:输出数据集;

*******************************************/

上一篇 下一篇

猜你喜欢

热点阅读