W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
SAS有一個強大的編程功能叫宏,它允許我們避免重復的代碼段,并在需要時一次又一次地使用它們。 它還有助于在代碼中創(chuàng)建動態(tài)變量,可以為同一代碼的不同運行實例使用不同的值。 宏還可以聲明為代碼塊,它將以類似于宏變量的方式被重復使用多次。 我們將在下面的例子中看到這兩個。
這些是保存由SAS程序一次又一次使用的值的變量。 它們在SAS程序開始時聲明,并在程序體中稍后調用。 它們可以是全局或局部范圍。
它們稱為全局宏變量,因為它們可以由SAS環(huán)境中可用的任何SAS程序訪問。 通常它們是由多個程序訪問的系統(tǒng)分配的變量。 一般的例子是系統(tǒng)日期。
下面是一個名為SYSDATE的SAS變量的示例,它表示系統(tǒng)日期。 考慮一種方案,以便在生成報告的每天的SAS報告的標題中打印系統(tǒng)日期。 標題將顯示當前日期和日期,而不為它們編碼任何值。 我們使用SASHELP庫中提供的名為CARS的內置SAS數(shù)據(jù)集。
proc print data = sashelp.cars; where make = 'Audi' and type = 'Sports' ; TITLE "Sales as of &SYSDAY &SYSDATE"; run;
當運行上面的代碼,我們得到以下輸出。
這些變量可以被SAS程序訪問,在這些程序中它們被聲明為程序的一部分。 它們通常用于向相同的SAS語句SL提供不同的變量,使得它們可以處理數(shù)據(jù)集的不同觀察值。
局部變量使用下面的語法聲明。
% LET (Macro Variable Name) = Value;
這里的值字段可以采取程序所需的任何數(shù)字,文本或日期值。 宏變量名是任何有效的SAS變量。
這些變量由SAS語句使用,并在變量名的開頭附加&字符。 下面的程序得到我們所有的觀察的'奧迪'和類型'體育'。 如果我們想要不同make的結果,我們需要更改變量make_name的值,而不改變程序的任何其他部分。 在帶來程序的情況下,這個變量可以在任何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;
當上面的代碼運行時,我們得到與上一個程序相同的輸出。 但是讓我們將type_name改為'Wagon',并運行相同的程序。 我們將得到以下結果。
宏是一組SAS語句,由名稱引用,并在程序中使用該名稱在任何地方使用它。 它以%MACRO語句開始,以%MEND語句結束。
局部變量使用下面的語法聲明。
# Creating a Macro program. %MACRO (Param1, Param2,….Paramn); Macro Statements; %MEND; # Calling a Macro program. %MacroName (Value1, Value2,…..Valuen);
以下程序在名為“show_result”的宏下對一組SAT staemnets進行解密; 此宏正由其他SAS語句調用。
%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);
當運行上面的代碼,我們得到以下輸出。
SAS有許多MACRO語句,它們內置在SAS編程語言中。 它們被其他SAS程序使用,而沒有明確聲明它們。 常見的例子是 - 當滿足一些條件時終止程序或捕獲程序日志中變量的運行時值。 下面是一些例子。
此宏語句將文本或宏變量信息寫入SAS日志。 在下面的例子中,變量“today”的值被寫入程序日志。
data _null_; CALL SYMPUT ('today', TRIM(PUT("&sysdate"d,worddate22.))); run; %put &today;
當某個條件的計算結果為真時,執(zhí)行該宏將導致當前執(zhí)行的宏正常終止。 在下面的示例中,當變量“val”的值變?yōu)?0時,宏終止其它連接。
%macro check_condition(val); %if &val = 10 %then %return; data p; x=34.2; run; %mend check_condition; %check_condition(11) ;
此宏定義包含一個%DO%WHILE循環(huán),根據(jù)需要以%END語句結束。 在下面的示例中,名為test的宏采用用戶輸入,并使用此輸入值運行DO循環(huán)。 DO循環(huán)的結束通過%end語句實現(xiàn),而宏的結束通過%mend語句實現(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)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: