こんにちは、読者の皆様。
この記事では、SAS Base言語の2つの手順とそれらのアプリケーションのわずかな微妙さについてお話します。
すでにこの言語で十分に作業している人にとっては、これらのことは初歩的なように思えますが、初心者にとってはおそらく、SAS Baseの知り合いの最初に踏み込んだ熊手を避けるのに役立つでしょう。
コールシンプト
呼び出しSymputは、データステップ(データステップ)の変数の値をマクロ変数に割り当てる必要がある場合に使用されます。
構文: call symput ("<>", < >)
symput
プロシージャの最初の引数は、2番目の引数の値を割り当てる必要があるマクロ変数の名前です。
2番目の引数は、マクロ変数に割り当てられる文字値です。 2番目の引数は常に正確にシンボリックである必要があります。そうでない場合は、マクロ変数に割り当てる前に数値をシンボル変数に変換する必要があります。 入力しないと、問題が発生する可能性があります。 この場合、SASは変数の数値をマクロ変数に割り当てる前に自動的に記号値に変換し、変換が実行されたことをログメッセージに表示します。
例:
data _null_;
count=1978;
call symput('count',count);
run;
%put &count;
19 data _null_;
20 count=1978;
21 call symput('count',count);
22 run;
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
21:21
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
23 %put &count;
1978
マクロ変数
count
は1978として定義されていましたが、SASは次のように述べました。
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
21:21
これを回避するには、数値をマクロ変数に割り当てる前に、数値を文字値に変換する必要があります。 ここでは、たとえば、これを行う方法:
data _null_;
count=1978;
call symput('count',strip(put(count,8.)));
run;
%put &count;
29 data _null_;
30 count=1978;
31 call symput('count',left(put(count,8.)));
32 run;
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
33 %put &count;
1978
注:
CALL SYMPUT
を使用して変数を作成したという事実にもかかわらず、このマクロ変数を同じデータステップで直接使用することはできません。 この現象の理由は、データステップがコンパイルおよび実行される前にマクロコードがコンパイルおよび実行されるためです。 そのため、 CALL SYMPUT
作成されたマクロ変数は、データステップコードの実行後または実行中にのみ作成および割り当てられるため、データステップでは使用できません。
(データステップ内で同じマクロ変数にアクセスする必要がある場合は、もちろん2つの異なるマクロ関数RESOLVE
またはSYMGET
を使用してこれを行うことができます)- SASは数値を常に右揃えにします。これにより、数値変数の値がその長さより短い場合、変換中にシンボル変数の先頭にスペースが挿入されます。 これらのスペースを取り除くには、先頭のスペースをすべて削除する関数を使用します(上記の例のように)。
CALL SYMPUT
プロシージャがマクロの外部(つまり、オープンソース)で使用される場合、グローバルマクロ変数を作成しますが、マクロの内部で使用される場合、ローカル変数を作成します。
コールシンプトックス
CALL SYMPUT
トラップをバイパスするために、SASはバージョン9で
CALL SYMPUTX
を発表しました。
CALL SYMPUTX
に対する
CALL SYMPUT
は次のとおりです。
SYMPUTX
数値をマクロ変数に割り当てる前に、数値を文字変数に自動的に変換します。 (上記の例のようにPUT式を使用して手動で変換する必要はなくなりました)CALL SYMPUTX
は、先頭および末尾のスペースを削除します。 したがって、余分なスペースをクリアするためにSTRIP
やLEFT
などの関数は必要ありません。
構文: call symputx ("<>", < >, < >)
最初の2つの引数は、
CALL SYMPUT
引数に似ています。 3番目の引数(シンボルテーブル)はオプションで、値G、L、またはFを取ることができます。Gを指定すると、グローバルシンボルテーブルにマクロ変数が作成されます。Lを指定すると、SASはマクロ変数をローカルテーブルに保存します。 3番目の引数が指定されていないかFに設定されている場合、
CALL SYMPUTX
は
CALL SYMPUTX
と同様に動作します。
例:
data _null_;
count=1978;
call symputx('count',count,'G');
run;
%put &count;
29 data _null_;
30 count=1978;
31 call symputx('count',count,'G');
32 run;
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
33 %put &count;
1978
注:
CALL SYMPUT
代わりに
CALL SYMPUTX
を使用した場合、プログラムは同じように実行されますが、数値の文字値への自動変換に関するログがログに発行されます。
CALL SYMPUT
と
CALL SYMPUTX
違い
を覚える
簡単な方法 :
(SAScommunity.orgのUsing_the_SAS_V9_CALL_SYMPUTX_Routineから取得)
SAS V9 CALL SYMPUTXプロシージャを使用すると、キーストロークを保存し、よりコンパクトでわかりやすいコードを作成できます。
使用する代わりに
call symput('macrovar', trim(left(charvar)));
余分なスペースを含む可能性のある文字列でマクロ変数を作成するには、SYMPUTXを使用する必要があります。
call symputx('macrovar', charvar);