|
Page Index |
(マクロ) |
|
(ユーザー定義関数) |
|
(サンプル集) |
|
|
(マクロ)
汎用的に使いたいプログラムをSAS マクロとして定義しておくことにより、部品として再利用しやすくなります。
同じような処理を繰り返す場合にマクロ命令が非常に効果的です。 |
|
参考にしたサイト:SAS Macro Language: Reference |
|
|
【マクロの定義】
%MACRO macro-name(para1,pana2・・・);
macro definition
%MEND macro-name;
【マクロ変数の定義】
%LOCAL 変数名n; /* マクロ変数のローカル宣言:マクロ定義の外では参照不可能 */
%GLOBAL 変数名n; /* マクロ変数のグローバル宣言:マクロ定義の外でも参照可能 */
CALL SYMPUT('変数名', 設定値); /* DATAステップ変数の値をマクロ変数として作成し格納 */
/* マクロ定義の外でも参照可能 */
マクロ変数は,保持する値は文字列だけです。
【マクロ変数の参照】
マクロ内外で変数を使う場合は、頭に「&」をつけます。
文字列の中でマクロ変数を参照する場合は,文字列はシングル(')でなく、ダブル(")を使います。
|
|
|
|
|
マクロの実行は、「%」で始まるマクロ命令文を記述します。
%マクロ名(引数、・・); |
|
|
|
|
%LETステートメントは、マクロ変数を定義します。
マクロ内で定義すればローカル変数になります。
例のように一部の文字列を可変(置き換え)にすることもできます。
文法
%LET (変数名)=(任意のテキスト);
使用例
%MACRO macro-name;
SET sas-data;
WHERE class="&myvar";
%MEND macro-name;
%LET myvar=abc;
%macro-name; /*マクロの呼び出し*/
SASデータセット「sas-data」の中の変数classの値がabcのオブザベーションだけを選択します。
|
|
|
|
|
ユーザが設定したマクロ変数の値やグ ローバルマクロ変数、ローカルマクロ変数などの値を全てログウィ
ンドウに出力します。
data _null_;
set sasuser.class;
retain max 0;
if max<weight then do;
call symput('NUM',trim(put(height,best.)));
end;
run;
%put &NUM; |
|
|
|
多くの言語ではSubやFunctionの中から、さらに自分自身を呼び出すような処理ができます。再帰呼び出しを利用することで、複雑な処理を非常に単純なコードとして実現できる場合があります。SASでは、CALL EXECUTEによってマクロの再帰呼び出しを実現することができます。下の例では、「PUT &cc」を5回実行します。
%MACRO countdown(cc);
If &cc > 0 Then
Do;
PUT &cc;
CALL Excecute('%countdon(&cc-1);');
END;
%MEND countdown;
%countdon(5);
Magazines :SAS Technical News spring 2001
の「Q&A」にも記載がありますので参照してください |
|
|
|
|
マクロを定義したソースコードをマクロ自動呼出しライブラリ(MACAUTOS)に保存しておくと、SAS起動時から呼出し可能な状態にすることができます。(この場合は呼出し時に、一度だけマクロ定義のコンパイル処理が行われます。)
また、マクロ定義時に、オプション指定(%MACROステートメントのSTOREオプション)を行っておくと、コンパイル済みのマクロ定義をユーザライブラリに保存しておくこともできます。(ただし、保存先はシステムオプション(SASMSTORED=)で事前に指定しておく必要があります。)
使用例
/*コンパイル済みマクロ「sample」を「C:\temp」ディレクトリに保存する*/
LIBNAME mylib 'C:\temp';
OPTIONS MSTORED SASMSTORE=mylib;
%MACRO sample /STORE;
PROC PRINT DATA=sashelp.class;
RUN;
%MEND sample;
/*保存したコンパイル済みマクロ「sample」を呼び出す*/
LIBNAME mylib 'C:\temp';
OPTIONS MSTORED SASMSTORE=mylib;
%sample
SAS Technical SAPPORTに詳細な記載がありますので参照してください |
|
|
(ユーザー定義関数) |
SAS version 9.2からユーザー独自の関数を作成できるプロシジャ FCMPプロシジャが新しく加わりました。 |
|
|
LIBNAME funclib "絶対パス"; /* 関数を収容するライブラリ*/
PROC FCMP OUTLIB=funclib.funcs.sample;
FUNCTION nendo(date) $; /* 関数名 */
_month=MONTH(date);
_year=YEAR(date);
IF _month IN(1,2,3) THEN _year+(-1);
nendo=PUT(_year,4.)||"年度";
RETURN(nendo);
ENDSUB;
RUN;
(あとはDATAステップ内で従来のSAS関数と同様に使用するだけです。)
OPTIONS CMPLIB = funclib.funcs; /*関数が収容されたデータセット名を指定*/
DATA _null_;
nendo=nendo(date);
RUN;
SAS社FAQサイト Technical Support Frequently
Asked Questions に詳細な記載があります
|
|
|
|
(サンプル集) |
|
|
(マクロ)
%MACRO age_keisan(birthdt,crntdt) ;
%GLOBAL year; /*グローバルマクロ変数の定義*/
year=INTCK('YEAR', birthdt, crntdt);
%MEND agekeisan;
%age_keisan(birthdt,crntdt)
(ユーザー定義関数)
LIBNAME funclib "絶対パス"; /* 関数を収容するライブラリ*/
PROC FCMP OUTLIB=funclib.funcs.sample;
FUNCTION age_keisan(birthdt,crntdt) ; /* 関数名 */
age_keisan=INTCK('YEAR', birthdt, crntdt);
RETURN(age_keisan);
ENDSUB;
RUN;
OPTIONS CMPLIB = funclib.funcs; /*関数が収容されたデータセット名を指定*/
DATA _null_;
age=age_keisan(birthdt,crntdt);
RUN; |
|
|
|
|
(マクロ)
%MACRO obss(dataset);
%GLOBAL obss; /*グローバルマクロ変数の定義*/
DATA _null_; /*オブザベーション数を取り出す*/
obss=%sysfunc(attrn(%sysfunc(open(&dataset,i)),NOBS));
CALL symput("NOBS",left(put(obss,12.))); /*マクロ変数 nobs に結果を格納*/
RUN;
%MEND obss;
%obss(dataset); |