ラベル マクロ: %LET の投稿を表示しています。 すべての投稿を表示
ラベル マクロ: %LET の投稿を表示しています。 すべての投稿を表示

2017年7月25日火曜日

そのマクロ変数、ローカル?グローバル?②%LET編




%LETでマクロ変数を定義した時に、ローカル・グローバルどちらになるのか説明します。
まずは以下がSAS内部の判定方法なのでご覧ください。






上の図を整理すると、、マクロ変数を定義する場所によって以下の動作をします。

マクロの外
・「グローバル」になる

マクロの中
・まず、同名のマクロ変数が既に定義されていないかチェックする。
・チェックする順は、「ローカル」→「グローバル」の順
・既に定義済の場合は、上書きする。
・「ローカル」にも「グローバル」にも定義済じゃない場合は、「ローカル」に新規作成。



では具体例でみていきましょう。
まず今回の解説で使うマクロ変数を予めリセット(削除)しときます。

%symdel MAC1 MAC2 MAC3 / nowarn;





動作確認


① マクロ外で定義したマクロ変数が、「グローバル」になる例。

%let MAC1 = abcd;
%put _user_;

ログ
GLOBAL MAC1 abcd



② マクロ内で定義したマクロ変数が、「ローカル」になる例。

%macro TEST(  MAC2 );
       %let MAC2 = 1234;
       %put _user_;
%mend;

%TEST( abcd );

ログ
TEST MAC2 1234

1つ補足ですが、マクロの引数として定義したマクロ変数は、必ず「ローカル」になります。
つまり、「%macro TEST(  MAC2 )」でローカルマクロ変数「MAC2」を定義しています。

次に「%let MAC2 = 1234」で、上記で既に定義した同名のローカルマクロ変数を上書きしています。



③ マクロ内で定義したマクロ変数が「グローバル」になる例

%let MAC1 = abcd;

%macro TEST;
   %let MAC1 = 1234;
   %put _user_;
%mend;

%TEST;

ログ
GLOBAL MAC1 1234

同名のグローバルマクロ変数が既に定義済なので上書きします。



④ マクロ内で定義したマクロ変数が、「ローカル」になる例。

%macro TEST;
       %let MAC3 = abcd;
       %put _user_;
%mend;

%TEST;

ログ
TEST MAC3 abcd

同名のマクロ変数がローカルにもグローバルにも定義済じゃないので、ローカルマクロ変数が作成されます。




次回はCALL SYMPUTによるローカル・グローバルの判定方法を紹介します。



記事一覧

1. 基本概念
2. %LET編
3. CALL SYMPUT編
4. マクロ変数の展開
5. マクロ変数の作成場所を明示的に指定する

2016年5月10日火曜日

マクロ言語入門1:マクロ変数とは【%LET】



マクロの入門記事を書いていきます。まずは基本の「マクロ変数」について解説。





マクロ変数とは?


以下のプログラムを見てください。

proc print data=SASHELP.CLASS;
run;

proc means data=SASHELP.CLASS;
run;

proc contents data=SASHELP.CLASS;
run;


データセットSASHELP.CLASSに対して、PRINT, MEANS, CONTENTSプロシジャを実行しています。
ここで 「SASHELP.CLASS」 を何回も書くのが面倒なのでマクロ変数を使って以下のように書き換えてみます。

%let DS = SASHELP.CLASS ;

proc print data=&DS;
run;

proc means data=&DS;
run;

proc contents data=&DS;
run;



解説
%let DS = SASHELP.CLASS ;

「DS」という名前で定義した入れ物に「SASHELP.CLASS」という値を入れています。
この入れ物を 「マクロ変数」 と呼びます。


マクロ変数に値を設定する構文は「%LET マクロ変数 = 格納値;」となっていて、

  • このステートメントで格納値の両端に半角スペースを入れても、それらスペースはマクロ変数に含められない(別記事で解説する%STR関数を使用して含めることも可)
  • SAS側で定義している「自動マクロ変数」というものもあって、それらと同じ名前のマクロ変数を定義しないよう注意(どんな自動マクロ変数があるかはリファレンスを参照)
  • 格納値に入れると挙動が変わってしまうマクロ特有の文字(&,%等)が存在。マクロを理解するとその辺りも分かってくると思います。


proc print data=&DS;
run;

プログラム中で 「&DS」 というように&をくっつけたものはマクロ変数として解釈されます。
よって「proc print data=&DS;」は「proc print data=SASHELP.CLASS;」に置き換えて実行されます。




マクロ変数を使う利点


便利なのが、対象のデータセットをSASHELP.IRISに変えて再実行したい場合、先頭のプログラムを変えるだけで済みます。

%let DS = SASHELP.IRIS ;

proc print data=&DS;
run;

proc means data=&DS;
run;

proc contents data=&DS;
run;




マクロ変数値の確認方法


「%PUT &マクロ変数名;」 でマクロ変数値をログに出力する事が出来ます。

%let DS = SASHELP.IRIS ;
%put &DS;

ログ
SASHELP.IRIS





記事一覧

1. マクロ変数とは
2. マクロの登録と実行
3. 定位置パラメータ
4. キーワードパラメータ
5. クォート処理
6. クォート処理2
7. ループ処理
8. 条件分岐処理
9. ドット
10. &&
11. 演算評価
12. 補足