SAS - 宏



SAS 具有一個強大的程式設計功能,稱為,它允許我們避免重複的程式碼段,並在需要時反覆使用它們。它還有助於在程式碼中建立動態變數,這些變數可以在同一程式碼的不同執行例項中取不同的值。宏也可以為程式碼塊宣告,這些程式碼塊將以類似於宏變數的方式重複使用多次。我們將在下面的示例中看到這兩者。

宏變數

這些變數儲存一個值,該值將被 SAS 程式反覆使用。它們在 SAS 程式的開頭宣告,並在程式主體中稍後呼叫。它們的範圍可以是全域性的或區域性的。

全域性宏變數

它們被稱為全域性宏變數,因為 SAS 環境中任何可用的 SAS 程式都可以訪問它們。通常,它們是系統分配的變數,多個程式可以訪問它們。一個常見的示例是系統日期。

示例

下面是一個名為 SYSDATE 的 SAS 變數的示例,它表示系統日期。考慮一個場景,每天生成報表時,在 SAS 報表的標題中列印系統日期。標題將顯示當前日期和星期幾,而無需我們為它們編碼任何值。我們使用 SASHELP 庫中可用的名為 CARS 的內建 SAS 資料集。

proc print data = sashelp.cars;
where make = 'Audi' and type = 'Sports' ;
   TITLE "Sales as of &SYSDAY &SYSDATE";
run;

執行上述程式碼後,我們將獲得以下輸出。

Global Macro Result

區域性宏變數

這些變數可以被宣告為程式一部分的 SAS 程式訪問。它們通常用於向相同的 SAS 語句提供不同的變數,以便它們可以處理資料集的不同觀測值。

語法

區域性變數使用以下語法宣告。

% LET (Macro Variable Name) = Value;

此處,Value 欄位可以根據程式需要採用任何數值、文字或日期值。宏變數名稱是任何有效的 SAS 變數。

示例

SAS 語句使用在變數名稱開頭附加的&字元來使用這些變數。下面的程式獲取製造商為“Audi”且型別為“Sports”的所有觀測值。如果我們想要不同製造商的結果,我們需要更改變數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;

執行上述程式碼後,我們將獲得與上一個程式相同的輸出。但是,讓我們將型別名稱更改為'Wagon'並執行相同的程式。我們將得到以下結果。

Local Macro Result

宏程式

宏是一組 SAS 語句,由名稱引用,並在程式中的任何位置使用該名稱來使用它。它以 %MACRO 語句開頭,以 %MEND 語句結束。

語法

區域性變數使用以下語法宣告。

# Creating a Macro program.
%MACRO <macro name>(Param1, Param2,….Paramn);

Macro Statements;

%MEND;

# Calling a Macro program.
%MacroName (Value1, Value2,…..Valuen);

示例

下面的程式在名為'show_result'的宏下聲明瞭一組 SAT 語句;此宏由其他 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);

執行上述程式碼後,我們將獲得以下輸出。

Program Macro Result

常用宏

SAS 有許多宏語句,它們是 SAS 程式語言的內建語句。它們由其他 SAS 程式使用,無需顯式宣告。常見的示例包括 - 在滿足某些條件時終止程式或在程式日誌中捕獲變數的執行時值。以下是一些示例。

宏 %PUT

此宏語句將文字或宏變數資訊寫入 SAS 日誌。在下面的示例中,變數“today”的值被寫入程式日誌。

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

執行上述程式碼後,我們將獲得以下輸出。

Macro Put

宏 %RETURN

當某些條件評估為真時,執行此宏會導致當前正在執行的宏正常終止。在下面的示例中,當變數"val"的值變為 10 時,宏終止,否則它繼續執行。

%macro check_condition(val);
   %if &val = 10 %then %return;

   data p;
      x = 34.2;
   run;  

%mend check_condition;  

%check_condition(11)  ;

執行上述程式碼後,我們將獲得以下輸出。

Macro Return

宏 %END

此宏定義包含一個%DO %WHILE迴圈,該迴圈根據需要以 %END 語句結束。在下面的示例中,名為 test 的宏獲取使用者輸入並使用此輸入值執行 DO 迴圈。DO 迴圈的結束透過 %end 語句實現,而宏的結束透過 %mend 語句實現。

%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)

執行上述程式碼後,我們將獲得以下輸出。

Macro do Finish
廣告