SAS宏

2018-12-14 11:43 更新

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程序使用,而沒有明確聲明它們。 常見的例子是 - 當滿足一些條件時終止程序或捕獲程序日志中變量的運行時值。 下面是一些例子。

宏%PUT

此宏語句將文本或宏變量信息寫入SAS日志。 在下面的例子中,變量“today”的值被寫入程序日志。

data _null_;
CALL SYMPUT ('today',
TRIM(PUT("&sysdate"d,worddate22.)));
run;
%put &today;

宏%RETURN

當某個條件的計算結果為真時,執(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)  ;

宏%END

此宏定義包含一個%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)


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號