ブログ

SASマクロ関数

SAS®マクロ言語は、SASプログ これにより、SASユーザーは”一度書かれた–何度も使用された”コンポーネントでプログラミングコードをモジュール化し、多くの場合、データ駆動型SASコードを自動的に生

関連するブログ記事: データセットに関する情報を取得するための多目的マクロ機能

Macro language and macro processor

一般に、SASソフトウェアは、SASプログラムを段階的に処理し、最初にマクロ言語オブジェクト&somenameとして参照されるマクロ変数、および%somenameとして参照されるマクロをスキャンします。 見つかった場合、SASソフトウェアは、SASがプログラミング手順をコンパイルして実行する前に、マクロ言語の構文に従ってそれらのマクロ参照を解決/P>

SASマクロ言語との比較 SASプログラミング言語

SASプログラムは、通常、二つの、多くの場合、織り込まれた層で構成されています–マクロ層と非マクロ層、それぞれ独自の構文 言い換えれば、SASコードは、2つの異なる言語の組み合わせです。

  • SASプログラミング言語(データステップ、PROCステップ、およびLIBNAME、OPTIONS、TITLEなどのグロー)
  • SASマクロ言語(%LET、%IF、%DO、マクロ関数などで構成されます。 これは、SASコンパイラがSASプログラミング言語コードを実行する前とは別に処理されます。それらの違いは、食事を調理することと食事を食べることの違いのようなものです。 この類推で食事=コード、料理=SASマクロ言語、食べる=SASプログラミング言語。 この違いを明確に理解することは、SASプログラマを成功させるための鍵です。

    2つのタイプのSASマクロ

    SASマクロには、2つの異なるタイプがあります。

    1. Sasプログラミング言語コードを生成するマクロは、SAS;SASプログラミング言語のコードまたはデータ値の一部として使用できる文字列値を生成するマクロですが、完全なSAS文または手順ではありません。
    2. このタイプでは、SAS実行可能コードは生成されず、値のみが生成されます。SASマクロ関数とは何ですか?

      SASマクロ関数は、値を生成するSASマクロです。 つまり、上記のタイプ2マクロです。 任意のSASマクロと同様に、SASマクロ関数は、任意の数(ゼロ以上)の位置パラメータまたは/および名前付きパラメータ(引数)を持つことができます。 SASユーザーは独自のマクロ機能を定義することができますが、その際にSAS言語の構文を使用することはできません。 既存のマクロ関数は、独自のマクロ関数定義で使用できます。 とりわけ、最も強力なの一つは、SASマクロ言語にSAS言語関数の富をもたらす%SYSFUNCマクロ関数です。

      SASマクロ関数のソース

      SASマクロ関数は、次の三つのソースから来ることができます。

      事前ビルドされたマクロ関数

      マクロプロセッサの一部である事前ビルドされたマクロ関数。 これらは、%eval、%length、%quote、%scan、%str、%sysfunc、%upcaseなどのマクロ関数です。 ここでは、事前に構築されたSASマクロ関数の完全なリストです。

      マクロ関数の自動呼び出し

      マクロの自動呼び出し、それらのいくつかはタイプ1(マクロ)、およびいくつかのタイプ2(マクロ関数)などの%cmpres、%left、%lowcase、%trim、%verify これらのマクロ関数は、事前に構築されたマクロ関数を補完します。 事前に作成されたマクロ関数との主な違いは、自動呼び出しマクロ関数は、SASマクロ言語で記述され、プログラムに定義または含めることなく使用で 自動呼び出しマクロ機能はSASソフトウェアのインストールに付属しており、通常はMAUTOSOURCEおよびSASAUTOS=macroシステムオプションを設定することで事前設定されて これらには、サイトでライセンスされているSAS製品に応じて、いくつかのマクロライブラリが含まれている場合があります。 たとえば、SAS BASEインストールの場合、auto-callマクロライブラリは次のフォルダにあります。

      C:\Program Sasソフトウェアで提供されている自動呼び出しマクロの選択リストを次に示します。

      使用の観点からは、事前に構築されたマクロ関数と自動呼び出しマクロ関数の違いに気付くことはありません。 たとえば、マクロ関数%upcase()は事前に構築されていますが、マクロ関数%lowcase()は自動呼び出しマクロ関数です。 彼らは完全に異なる家族に属していますが、私たちはそれらを補完的な兄弟であるかのように使用します。最後に、SASのインストールには付属していないユーザー定義マクロ関数があります。

      ユーザー定義マクロ関数

      最後に、SASのインストールには付属していないユーザー定義マクロ関数があります。 これらは、自分で定義するマクロ関数です。 通常、これらは主にSASが提供するものと区別するために、自動呼び出しマクロとは別に保持されます。自動呼び出しマクロライブラリ(またはライブラリ)に加えて、独自のSASマクロライブラリへのアクセスを有効にするには、INSERT=systemオプションを使用できます。
      options insert=(sasautos=”path_to_your_own_macro_library_folder”);

      SASAUTOS値を置き換える代わりに、このオプションは既存のSASAUTOSオプションに追加の値を最初の値として挿入するため、最初に独自のマクロライブラリ

      ユーザー定義マクロ関数の作成

      次の例を考えてみましょう。 データセット名を引数として取り、そのデータセット内の観測値の数に等しい値を返すマクロ関数を作成するとします。次のコードは、データセット内の観測値の数を計算することがわかっています。

      data_null_;call symputx('NOBS',n);stop;SET SASHELP。CARS nobs=n;run;%put&=NOBS;NOBS=428

      このコードをマクロに囲んでSASマクロ関数を作成できますか? このようなもの:

      %macro nobs(dset=,result=);%global&result;data_null_;call symputx("&result",n);stop;set&result",n);stop;set&dset nobs=n;実行;%mend nobs;

      答えは”いいえ”です。 このマクロを呼び出して結果を生成することができます。

      %nobs(dset=SASHELP.CARS,result=NOBS);%put&=NOBS;NOBS=428

      しかし、これはマクロ関数ではありません。 SASプログラミング言語コードを生成しないタイプ2マクロ、単なる値を覚えていますか? しかし、このマクロは、2番目の引数(result=NOBS)として指定されたマクロ変数に値を割り当てるSASコードを生成します。有効なマクロ関数を作成するには、マクロにSAS言語コードを含めるべきではありません–DATAステップもPROCステップもありません。 SASマクロ言語コードのみで構成することができます。 ここでは次のとおりです。

      %macro nobs(dset);%local dsid n;%let dsid=%sysfunc(open(&dset));%if&dsid%then%do;%let n=%sysfunc(open(&dsid%then%do;%let n=%sysfunc(open(&dset));%if&dsid%then%do;%let n=%sysfunc(attrn(&dsid,nlobs));%let dsid=%sysfunc(close(&dsid));%end;%else%put%sysfunc(sysmsg()); &n%mend nobs;

      マクロプロセッサがこのマクロを実行すると、SAS言語コンパイラに渡されるオブジェクトは、%mendの直前の行に示されている値 これは、観測値の数の計算値です(&nで表されます)。 これはSAS言語コンパイラによって表示される唯一のものであり、残りはsas macro processorによって表示され、処理されるマクロ言語コードです。

      重要なこと

      : SASマクロ関数を定義するときは、常に%localステートメントを使用して、マクロで作成されたすべてのマクロ変数を一覧表示し、呼び出し元の環境で同じ名前 マクロパラメータは常に自動的にローカルであるため、マクロパラメータに%localを宣言する必要はありません。

      SASマクロ関数の使用例

      マクロ関数がこのように定義されている場合、その呼び出しを行う場所はどこでも%nobs(SASHELP.SASコードでは、SASマクロプロセッサによって評価され、対応する値(この場合は番号428)に置き換えられます。 そうすれば、標準以下のハードコーディングを回避し、SASコードを動的かつ強力にすることができます。 マクロ関数は、多くのSASコーディングコンテキストで使用できます。 たとえば、次のようにします。

      • マクロ変数の代入ステートメント:%let NOBS=%nobs(SASHELP.データステップにおける代入文:x=%nobs(SASHELP.データステップの式の一部として:x=%nobs(SASHELP.CARS)/2+3;
      • データステップの値としてループを行います: 私は%nobsに=1を行いますか(SASHELP。マクロdoループの値として:%do&i=1%to%nobs(SASHELP.IF文の条件の一部としての
      • if%nobs(SASHELP.車)>500その後、行います。

      というように。 マクロ関数への引数(パラメータ)は、SAS定数またはSAS定数に解決されるマクロ式のいずれかでなければならないことに注意することが重要です。 マクロ関数は、SASプログラムの実行前にマクロプロセッサによって解決されるため、引数は変数名にすることはできません。 これは、マクロ関数とSAS関数の主な違いです。あなたの考えは?

      あなたの考えは?

      あなたはこの投稿が役に立つと思いますか?

      SASマクロ機能を使用していますか? 他の使用例を提案できますか? 以下のコメントで私たちと共有してください。

コメントを残す

メールアドレスが公開されることはありません。