宏參數(shù)被用來(lái)傳遞傳遞值或者文本字符串給宏誉裆,能讓你不用%let就能定義宏變量。
宏參數(shù)有兩種類型:一種是positional parameter,另一種是keyword(named) parameter。
一:位置參數(shù)(positional parameter)
位置參數(shù)的名稱來(lái)源于這樣一個(gè)事實(shí):即它們是使用%Macro語(yǔ)句上的特定位置來(lái)定義的腻惠。當(dāng)調(diào)用宏時(shí)衷恭,該值將通過(guò)宏調(diào)用中與宏定義中相同的對(duì)應(yīng)位置傳遞.位置參數(shù)比關(guān)鍵詞參數(shù)有一點(diǎn)點(diǎn)好處,只是少一點(diǎn)點(diǎn)內(nèi)存校套。
%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;
在調(diào)用帶有參數(shù)的宏時(shí),在宏名稱后面是一個(gè)用逗號(hào)分隔的參數(shù)值列表牧抵,這些參數(shù)值由圓括號(hào)括起來(lái)笛匙。
比如下面這樣
%look(sashelp.cars,10)
你不必給所有的位置參數(shù)一個(gè)值,比如下面這樣,但是不一定會(huì)產(chǎn)生可用的代碼
%look() ---報(bào)錯(cuò)
%look(sashelp.cars) ---報(bào)錯(cuò)
%look(,10)---報(bào)錯(cuò)
比如我們調(diào)用這個(gè)%look(,10)犀变,對(duì)于為空的參數(shù)妹孙,SAS會(huì)解析成空字符串(null string),所以%look(,10)會(huì)解析成
title "data set ";
proc contents data=;
run;
title2 "first 10 observations";
proc print data= (obs=10);
run;
這段程序包含語(yǔ)法錯(cuò)誤,所以肯定會(huì)報(bào)錯(cuò)获枝,也不會(huì)運(yùn)行蠢正。
二:關(guān)鍵詞參數(shù)(keyword parameter)
關(guān)鍵詞參數(shù)可以用在任何位置,也可以設(shè)置默認(rèn)的值。形式是有一個(gè)等于號(hào)省店。
%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)
注意到在宏里面是我是把宏參數(shù)dsn放在前面嚣崭,但是調(diào)用的時(shí)候我給他們換了一下位置,這樣是不會(huì)報(bào)錯(cuò)的懦傍,但是還是建議按順序來(lái)雹舀。
如果你需要多次調(diào)用一個(gè)宏,且某個(gè)宏參數(shù)的值不變的話粗俱,你可以直接在宏里面提前把值寫(xiě)上说榆,比如這樣:
%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);/這時(shí)候會(huì)替換成class數(shù)據(jù)集/
需要注意的是,如果你的位置參數(shù)和關(guān)鍵詞參數(shù)用法混用的話寸认,要嚴(yán)格按照所列的順序賦值签财,下面這段程序肯定會(huì)報(bào)錯(cuò)
%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)
上面就是關(guān)于宏參數(shù)需要注意的一些點(diǎn),當(dāng)然還有一些好的編程習(xí)慣偏塞,假設(shè)你的宏里面宏參數(shù)有很多個(gè):
1)將橫向結(jié)構(gòu)轉(zhuǎn)換成縱向結(jié)構(gòu)
2)參數(shù)能簡(jiǎn)要描述輸入的內(nèi)容
3)當(dāng)多次調(diào)用宏都是用默認(rèn)值的時(shí)候唱蒸,可以把默認(rèn)值放到宏參數(shù)中
4)對(duì)每一個(gè)參數(shù)最好有對(duì)應(yīng)的注釋。
%look(dsn=,
var1=Y,
var2=,
var3=N,
obs=,
dsout=)烛愧;
/******************************************
dsn:輸入數(shù)據(jù)集
var1:XXXXXXXXXXX;
var2:XXXXXXXXXXX;
var3:XXXXXXXXXXX;
obs:XXXXXXXXXXX;
dsout:輸出數(shù)據(jù)集;
*******************************************/