SAS有一個(gè)強(qiáng)大的編程功能叫宏,它允許我們避免重復(fù)的代碼段,并在需要時(shí)一次又一次地使用它們。 它還有助于在代碼中創(chuàng)建動(dòng)態(tài)變量,可以為同一代碼的不同運(yùn)行實(shí)例使用不同的值。 宏還可以聲明為代碼塊,它將以類似于宏變量的方式被重復(fù)使用多次。 我們將在下面的例子中看到這兩個(gè)。
這些是保存由SAS程序一次又一次使用的值的變量。 它們?cè)赟AS程序開始時(shí)聲明,并在程序體中稍后調(diào)用。 它們可以是全局或局部范圍。
它們稱為全局宏變量,因?yàn)樗鼈兛梢杂蒘AS環(huán)境中可用的任何SAS程序訪問。 通常它們是由多個(gè)程序訪問的系統(tǒng)分配的變量。 一般的例子是系統(tǒng)日期。
下面是一個(gè)名為SYSDATE的SAS變量的示例,它表示系統(tǒng)日期。 考慮一種方案,以便在生成報(bào)告的每天的SAS報(bào)告的標(biāo)題中打印系統(tǒng)日期。 標(biāo)題將顯示當(dāng)前日期和日期,而不為它們編碼任何值。 我們使用SASHELP庫中提供的名為CARS的內(nèi)置SAS數(shù)據(jù)集。
proc print data = sashelp.cars; where make = 'Audi' and type = 'Sports' ; TITLE "Sales as of &SYSDAY &SYSDATE"; run;
當(dāng)運(yùn)行上面的代碼,我們得到以下輸出。
這些變量可以被SAS程序訪問,在這些程序中它們被聲明為程序的一部分。 它們通常用于向相同的SAS語句SL提供不同的變量,使得它們可以處理數(shù)據(jù)集的不同觀察值。
局部變量使用下面的語法聲明。
% LET (Macro Variable Name) = Value;
這里的值字段可以采取程序所需的任何數(shù)字,文本或日期值。 宏變量名是任何有效的SAS變量。
這些變量由SAS語句使用,并在變量名的開頭附加&字符。 下面的程序得到我們所有的觀察的'奧迪'和類型'體育'。 如果我們想要不同make的結(jié)果,我們需要更改變量make_name的值,而不改變程序的任何其他部分。 在帶來程序的情況下,這個(gè)變量可以在任何SAS語句中被再次引用。
%LET make_name = 'Audi'; %LET type_name = 'Sports'; proc print data = sashelp.cars; where make = &make_name and type = &type_name ; TITLE "Sales as of &SYSDAY &SYSDATE"; run;
當(dāng)上面的代碼運(yùn)行時(shí),我們得到與上一個(gè)程序相同的輸出。 但是讓我們將type_name改為'Wagon',并運(yùn)行相同的程序。 我們將得到以下結(jié)果。
宏是一組SAS語句,由名稱引用,并在程序中使用該名稱在任何地方使用它。 它以%MACRO語句開始,以%MEND語句結(jié)束。
局部變量使用下面的語法聲明。
# Creating a Macro program. %MACRO (Param1, Param2,….Paramn); Macro Statements; %MEND; # Calling a Macro program. %MacroName (Value1, Value2,…..Valuen);
以下程序在名為“show_result”的宏下對(duì)一組SAT staemnets進(jìn)行解密; 此宏正由其他SAS語句調(diào)用。
%MACRO show_result(make_ , type_); proc print data = sashelp.cars; where make = "&make_" and type = "&type_" ; TITLE "Sales as of &SYSDAY &SYSDATE"; run; %MEND; %show_result(BMW,SUV);
當(dāng)運(yùn)行上面的代碼,我們得到以下輸出。
SAS有許多MACRO語句,它們內(nèi)置在SAS編程語言中。 它們被其他SAS程序使用,而沒有明確聲明它們。 常見的例子是 - 當(dāng)滿足一些條件時(shí)終止程序或捕獲程序日志中變量的運(yùn)行時(shí)值。 下面是一些例子。
此宏語句將文本或宏變量信息寫入SAS日志。 在下面的例子中,變量“today”的值被寫入程序日志。
data _null_; CALL SYMPUT ('today', TRIM(PUT("&sysdate"d,worddate22.))); run; %put &today;
當(dāng)某個(gè)條件的計(jì)算結(jié)果為真時(shí),執(zhí)行該宏將導(dǎo)致當(dāng)前執(zhí)行的宏正常終止。 在下面的示例中,當(dāng)變量“val”的值變?yōu)?0時(shí),宏終止其它連接。
%macro check_condition(val); %if &val = 10 %then %return; data p; x=34.2; run; %mend check_condition; %check_condition(11) ;
此宏定義包含一個(gè)%DO%WHILE循環(huán),根據(jù)需要以%END語句結(jié)束。 在下面的示例中,名為test的宏采用用戶輸入,并使用此輸入值運(yùn)行DO循環(huán)。 DO循環(huán)的結(jié)束通過%end語句實(shí)現(xiàn),而宏的結(jié)束通過%mend語句實(shí)現(xiàn)。
%macro test(finish); %let i=1; %do %while (&i <&finish); %put the value of i is &i; %let i=%eval(&i+1); %end; %mend test; %test(5)
更多建議: