2

SAS 9.1.3 を使用して DATA ステップでマクロを呼び出していますが、マクロは PROC REPORT ステップを生成するため、CALL EXECUTE を使用してそれを呼び出し、それらすべての PROC REPORT ステップを生成し、その後すべてを実行しています。データステップ。

私は配列を使用しており、この配列内のすべての要素に対して毎回マクロが実行されます。

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 の実行順序を変更して、質問レポートを順番に印刷できるようにする方法はありますか、それとも独自のことを行うだけですか?

ありがとう!

4

3 に答える 3

5

私はあなたがあなたのラインのためにこのような何かを意味すると思います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;

ログ

注:CALLEXECUTEで生成された行。
1+データtest_question1; i=1から10000000を実行します。出力; 終わり; 走る;

注:データセットWORK.TEST_QUESTION1には、10000000個の観測値と1個の変数があります。
注:使用されるDATAステートメント(合計処理時間):
      リアルタイム6.14秒
      CPU時間0.45秒


1 +;
2+データtest_question2; i=1から10000000を実行します。出力; 終わり; 走る;

注:データセットWORK.TEST_QUESTION2には、10000000個の観測値と1個の変数があります。
注:使用されるDATAステートメント(合計処理時間):
      リアルタイム3.87秒
      CPU時間0.53秒


2 +;
3+データtest_question3; i=1から10000000を実行します。出力; 終わり; 走る;

注:データセットWORK.TEST_QUESTION3には、10000000個の観測値と1個の変数があります。
注:使用されるDATAステートメント(合計処理時間):
      リアルタイム3.12秒
      CPU時間0.45秒
于 2009-09-04T14:57:38.973 に答える
2

データ ステップがコンパイルされてから実行されます。はcall execute(str);str を入力キューにプッシュし、データ ステップの実行が完了した後にそれらがポップされるようにします。順序は保持されます、期間。

ただし、次のようにマクロ呼び出しを二重引用符で囲んだ文字列に入れると、次のようになります。 call execute("%report(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
*/
于 2009-09-10T15:48:08.270 に答える
1

私はマクロ言語を使用してマクロ関連のすべてを行うことを好みます。トレードオフは、プログラム全体に小さなマクロが散在していることだと思います。ただし、プログラムがレポートを生成しないようにするには、マクロ呼び出し(*%loopit;)をコメントアウトするだけです。また、「question1」、「question2」、「question3」などを入力する必要はありません!!!
うまくいけば、これはあなたに役立つでしょう!

%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;
于 2009-09-04T19:00:58.503 に答える