2017-06-26 14 views
1

各リストに複数のものがある場合、このコードは正しく実行されません。位置パラメータマクロ変数に関するSASエラーを修正する方法

%macro loop(list1, list2); 

    %let n=%sysfunc(countw(&list1)); 
    %do i=1 %to &n; 
    %let O_list1 = %scan(&list1, &i, ''); 
    %let O_list2 = %scan(&list2, &i, ''); 

data taxes; 
    food=3*&O_List1; 
    materials = 4*&O_List2 

%end; 
%mend; 

%loop(1, 4); 
/* %loop(1 3, 4 6) */ 

それは、コードが実行されないと、私は理由を把握することができないようにコメントセクションにあるように私がループを作る場合はここで出力は3と16です。ありがとう!

+0

、それは '実行を追加することをお勧めします。あなたのDATAステップを終了する'ステートメントを。 – Quentin

+0

%SCAN()に、リストが一重引用符で区切られていると言いましたので、各リストには1つの項目しかありません。これは、その項目に埋め込まれたスペースによって、マクロが無効なSASコードを生成することを意味します。また、リスト内に複数の項目がある場合、同じ出力データセットを上書きし続けるだけで、マクロの全体的なロジックに欠陥があります。マクロの全体的な目標は何ですか? – Tom

+0

@Tomそれを指摘してくれてありがとう、私は上書きの問題を修正するためにa_&Iを追加しました。私の実際のプログラムでのプログラムの目的は、同時に2つのリストを繰り返し処理することです。このようにして、私は必要なテーブルを手に入れることができます。これを理解したので、作成したテーブルをすべて追加する方法を理解する必要があります。 –

答えて

2

%scanの第3引数を''から%str()に変更してください。現時点では、SASマクロ言語ではすべてがテキストであり、procsとデータステップのように文字定数を引用する必要がないため、入力リストに'区切り文字があります。しかし、引用符で囲まれていないスペースを入力するだけでは、マクロプロセッサがすべてをトリミングしないので、適切なマクロ引用機能を使用する必要があります。

SASの配列のドキュメントを参照することもできます。これは通常、データステップ内で複数回計算を実行するための簡単なオプションです。

+0

ありがとうございました!また、変数の宣言されている行にセミコロンを追加しました。 run文は%mendの後にも追加されました。私はちょうどこれはランタイムで配列のオプションが速いだろうと思っていますか?ありがとう! –

0

COUNTW()関数と%SCAN()関数呼び出しの両方に同じ区切り文字を使用してください。マクロプロセッサの引用符は、文字列の一部であり、値の先頭または末尾にスペースが含まれていることを覚えておいてください。マクロ引用符で囲む必要があります。

%let n=%sysfunc(countw(&list1,%str())); 
%do i=1 %to &n; 
    %let item1 = %scan(&list1, &i, %str()); 
    %let item2 = %scan(&list2, &i, %str()); 

あなたのリストは本当にただ& N観察とデータセットを作成するために使用されているなら、あなたはおそらくDOまたは%SCAN(%を使用する必要はありません)。

あなたのエラーに関連していない
%macro taxes(list1, list2); 
%local n ; 
%let n=%sysfunc(countw(&list1)); 

data taxes; 
    array _1 (&n) _temporary_ (&list1); 
    array _2 (&n) _temporary_ (&list2); 
    do row=1 to &n ; 
    food=3*_1(row); 
    materials = 4*_2(row); 
    output; 
    end; 
run; 

%mend; 
%taxes(list1=1 3, list2=4 6); 
proc print data=taxes; 
run; 

enter image description here

関連する問題