2016-04-07 12 views
2

多くの行のコードを入力する必要がないように、SASで配列変数にラベルを付けるためにマクロを使用しようとしています。私がしようとしているのは基本的にはこれです:SAS:配列に渡されるマクロ

%macro LABEL_ARRAY(V); 
%DO I = 1 %TO 4; 
    %let variablename=&V(&I); 
    array1[&I] = "Value of &variablename" 
%END 
%MEND LABEL_ARRAY; 

したがって、Vは配列array1内の位置に対応する変数名を含む配列です。私は配列ごとに4つ以上の変数と多数の配列に対してこれを実行しようとしていますが、それは基本的な考え方です。基本的に何が起きているのかは、array1 [& I]です。最初のエントリでarray1 [1]と言っていますが、値は使用していません。&私は& variablenameと同じことを言っています。

何が起こっているかについてのご意見はありますか?ありがとう。

+0

あなたは%let variablename =&&V(&I);を試してみることができますが、それはうまくいくかどうかはわかりませんが、実際にそれを次のように変更してください:%let variablename = &&V&I;それはうまくいくはずです – DCR

+0

私はあなたが欲しいものとして混乱しています。マクロを使用するデータステップを表示できますか?変数にラベルを付けるが、LABELステートメントはないと言う。 Array1 [&i]はあなたが望むようにarray1 [1]に解決します。 &Variablenameは変数名に解決されません。あなたはVNAME関数を見たいかもしれません。しかし、データ・ステップ配列を使用して変数ラベルを割り当てることはできません。 – Quentin

+0

@Quentinこれは、おそらく 'label%label_array(v);'のように使われるラベルステートメントを作ります。 – Joe

答えて

2

SASでは、マクロ言語には組み込みの配列型はありません(実際にはマクロ型はありません)。

マクロ配列は代わりにアンパサンドの複数の解像度で処理されます。一般的なケースでの正確な動作の詳細については、this answerをお読みください。

ただし、特定のマクロ変数「配列」の場合は、それらがどのように機能するかを正確に説明する価値があります。

何を持っていることはそうのようなマクロ変数のセット可能性があります:

%let v = Color; 
%let color1=Blue; 
%let color2=Red; 
%let color3=Green; 

そして、あなたが行うことができるようにしたい:その除き

%do _i = 1 to 3; 
    %let thisColor = &color&_i; 
%end; 

は動作しません - &color解決されるため(また、別途定義しないと&colorに解決されます)、&i1に解決され、&color1ではなくBlueではなく、に関する警告メッセージが残ります0解決しない。

の解像度を&_iが解決するまで遅らせる必要があります。 2番目のアンパサンドを追加することでこれを行うことができます。つまりは1 &に2 &&を解決するが、解決のためにキューにそれを維持するためにSASを伝え何

%do _i = 1 to 3; 
    %let thisColor = &&color&_i; 
%end; 

。 2番目のパスで、その単一の&を解決します。だからあなたは持っている

&&color&_i 
&color1 
Blue 

2番目のレベルで停止する代わりに。

これは、私の論文Unravelling the Knot of Ampersands、およびロン・フェルドのArray: Construction and Usage of Arrays of Macro Variablesでより詳細に説明されています。

+0

これに加えて、データ駆動型プログラミング(google SAS +)でこれを行う方が簡単なので、マクロ変数配列の代替案を検討することをお勧めします。 – Joe

+0

うわー、ありがとう、@ジョー、これはすべてのスーパーに役立つです! – kyro1021

関連する問題