私はSASでスタックをEXECUTE CALLの実行順序を変更することはできますか?
質問
、私は、DATAステップでマクロを呼び出すためにSAS 9.1.3を使用していますが、マクロはPROC REPORTステップを生成し、すべてのデータのステップの後ます。
Iは、アレイを使用している、およびマクロは、この配列の各要素のためのたびに実行されます。
DATA macro_test;
ARRAY questions[3] $ 32 ('question1' 'question2' 'question3');
DO i=1 to 3;
a_question = questions(i);
CALL EXECUTE( "%report_by_question(a_question)" );
end;
RUN;
事は、レポートの出力は逆方向(通常は)出てきているされて - それは最初question3印刷され、その後、2、その後1
私はレポートが順序で印刷疑問を持つことができますので、CALLの実行順序は、EXECUTE変更する方法はありますか、それだけで、自身のことを行うのですか?
ありがとうございます。
解決
私は仮定しますyoutはcall execute()
ラインのためのより多くのこのような平均何かます:
CALL EXECUTE( "%report_by_question(" || trim(left(a_question)) || ");" );
テストマクロで私はcall execute()
sが正しい順序で起こっていることを示し、このようないくつかのログの行を取得します。あなたが似た何かを得るのですか?
マクロの
%macro report_by_question(a);
data test_&a;
do i=1 to 10000000;
output;
end;
run;
%mend;
のログの
NOTE: CALL EXECUTE generated line. 1 + data test_question1; do i=1 to 10000000; output; end; run; NOTE: The data set WORK.TEST_QUESTION1 has 10000000 observations and 1 variables. NOTE: DATA statement used (Total process time): real time 6.14 seconds cpu time 0.45 seconds 1 + ; 2 + data test_question2; do i=1 to 10000000; output; end; run; NOTE: The data set WORK.TEST_QUESTION2 has 10000000 observations and 1 variables. NOTE: DATA statement used (Total process time): real time 3.87 seconds cpu time 0.53 seconds 2 + ; 3 + data test_question3; do i=1 to 10000000; output; end; run; NOTE: The data set WORK.TEST_QUESTION3 has 10000000 observations and 1 variables. NOTE: DATA statement used (Total process time): real time 3.12 seconds cpu time 0.45 seconds
他のヒント
データステップがコンパイルされて実行されます。 call execute(str);
はの後にの彼らはポップさそうということは、入力キューにSTRをプッシュデータステップが行わ実行です。順序は期間、保存されます。
しかし、あなたがそうであるようにあなたは、二重引用符で囲まれた文字列にマクロ呼び出しを置く場合: 実行呼び出し( "%レポート(Q)"); データ・ステップは、データステップが実行を開始する前であってもである、コンパイルされたときにマクロが呼び出されます。
あなたは、コンパイル時にマクロを呼び出し、その後のいずれかのマクロ引用それを、または単一引用符で囲まれた文字列に入れたくない場合。以下は一例です。この情報がお役に立てば幸いです。
/* create a dataset with 1 var and 3 obs */
data qs;
input q $;
cards;
q1
q2
q3
;
run;
/* reporting macro -- a mockup */
%macro report(q=);
%put report for q=&q;
%mend report;
/* call the reporting macro for each q */
data _null_;
set qs;
macro = catx(q, '%report(q=', ')');
call execute(macro);
run;
/* on log
report for q=q1
report for q=q2
report for q=q3
*/
/* to show what happens when the
macro is invoked during the compile
time */
data _null_;
call execute("%report(q=q1)");
put "after call execute";
run;
/* on log
1 data _null_;
2 call execute("%report(q=q1)");
report for q=q1
3 put "after call execute";
4 run;
after call execute
*/
私はマクロ言語を使用して、関連するすべてのマクロを行うことを好みます。私は、トレードオフは、あなたのプログラムに散在少しマクロを持っているということですね。 はまた、は、あなたが「question1」、「question2」、「question3を」アウト入力する必要はありません。ただし、レポートを生成するから、あなたのプログラムを防ぐために、単にマクロ呼び出し(*%のloopit)をコメントアウトなど!!!
うまくいけば、これはあなたに便利です!
%macro report_by_question(input);
%put "Question: " &input;
%mend;
%macro loopit;
%do i=1 %to 3;
%report_by_question("question&i.");
%end;
%mend loopit;
%loopit;