6

一般に、マクロ変数をマクロ内で変更する必要がある状況にどのように対処すればよいでしょうか。たとえば、次のマクロがあるとします。

%macro test (arg=); 
array arrayone [&arg];   /* This is ok */
array arraytwo [&arg+1] /* This is not ok. How to make it work? */ 
... 

%test(3) が必要で、arraytwo が次元 4 を取得する必要がある場合、これらの状況をどのように管理しますか?

4

2 に答える 2

5

に変更します

array arraytwo[%EVAL(&ARG + 1)] ;

于 2011-03-25T09:42:15.220 に答える
3

整数演算のみが必要な場合は、%eval を使用するだけで十分です。マクロ変数で浮動小数点演算を実行する必要がある場合は、代わりに %sysevalf を使用する必要があります。

ほとんどのデータ ステップ関数は、次の 2 つの方法のいずれかを使用してマクロ変数に直接適用できます。

 1. %function()
 2. %sysfunc(function())

最も一般的に使用される関数の多くには、正確に同等のマクロがあり、関数名の前に % を追加するだけで済みます。正確なマクロ同等物を持たない関数は、通常、%sysfunc() 内で呼び出すことにより、マクロ変数を受け入れるようにすることができます。通常、一重引用符で囲まれた文字列を予期するデータ ステップ関数は、引用符を削除しない限り、%sysfunc() を介してマクロ コードで呼び出されると失敗します例えば

data _null_;
  x = rand('uniform');
run;

データ ステップでは問題なく動作しますが、マクロ コードの一部でマクロ変数に同じ値を与えるには、次を使用する必要があります。

%let x = %sysfunc(rand(uniform));

これは、マクロ環境では、SAS がテキスト一様を文字列として解釈するのに対し、データ ステップでは、SAS が引用符で囲まれていないテキストを変数の名前として解釈するためです。

于 2012-02-26T21:06:06.960 に答える