前のページ|次のページ

%SYSFUNC関数と%QSYSFUNC関数

SAS関数またはユーザー作成の関数を実行します。

種類: マクロ関数
ヒント: %SYSFUNC関数と%QSYSFUNC関数は最大32文字のSAS関数名をサポートします。

構文

%SYSFUNC(function(argument(s))<, format>)
%QSYSFUNC(function(argument(s))<, format>)

必須引数

function

実行する関数名を指定します。SAS関数、SAS/TOOLKITソフトウェアを使って作成した関数、または(FCMP Procedure (Base SASプロシジャガイド))を使って作成した関数のいずれかを指定できます。マクロ関数は指定できません。

%SYSFUNC関数および%QSYSFUNC関数では、すべてのSAS関数(ただし、%SYSFUNC関数および%QSYSFUNC関数で使用できないSAS関数に記載されているものは除く)を使用できます。
単一の%SYSFUNC関数で使用する場合、関数のネストは行えません。ただし、次の例のように、%SYSFUNC関数の呼び出しはネストできます。
%let x=%sysfunc(trim(%sysfunc(left(&num))));
SAS 6.12で導入された%SYSFUNC関数で使用できるSAS関数の構文については、%SYSFUNC関数で使用する関数の構文をご覧ください。

argument(s)

functionが使用する1つ以上の引数を指定します。各argumentには、関数の引数を生成するマクロ変数参照やテキスト式を指定できます。argumentが次に示すような特殊文字やニーモニック演算子を含んでいる場合、%QSYSFUNCを使用します。

format

functionの結果に適用されるオプションの出力形式を指定します。SAS提供の出力形式、FORMATプロシジャにより生成される出力形式、またはSAS/TOOLKITを使って作成された出力形式を指定できます。formatのデフォルト値はありません。formatを指定しない場合、SASマクロ機能は結果に対してformat操作を実行せず、functionのデフォルト値を使用します。

詳細

%SYSFUNC関数はマクロ関数であるため、DATAステップ関数の場合とは異なり、文字値を引用符で囲む必要はありません。たとえば、OPEN関数を単独で指定する場合、その引数を引用符で囲んで指定しますが、%SYSFUNC関数の内部で使用する場合、引用符は必要はありません。次のステートメントは、この違いを示しています。
  •  dsid=open("Sasuser.Houses","i");
  •  dsid=open("&mydata","&mode");
  •  %let dsid = %sysfunc(open(Sasuser.Houses,i));
  •  %let dsid=%sysfunc(open(&mydata,&mode));
%SYSFUNC関数の内部にあるDATAステップ関数の引数はすべてカンマで区切る必要があります。OFというワードで始まる引数リストは使用できません。
注: %SYSFUNC関数の引数は、SASマクロ言語の規則に従って評価されます。これには、関数名および関数の引数リストの両者が含まれます。特に、引数位置が空である場合、NULL引数ではなく、長さがゼロの引数が生成されます。
%SYSFUNC関数は、結果に含まれる特殊文字やニーモニック演算子をマスクしません。一方、%QSYSFUNC関数は、結果に含まれる次の特殊文字とニーモニック演算子をマスクします。
& % ' " ( ) + − * / < > = ¬ ^ ~ ; , #  blank
AND OR NOT EQ NE LE LT GE GT IN
%SYSFUNC関数または%QSYSFUNC関数により呼び出される関数が数値引数を必要とする場合、マクロ機能は引数を数値に変換します。%SYSFUNC関数および%QSYSFUNC関数は、それらが実行する関数が浮動小数点数をサポートする場合には浮動小数点数を返します。
%SYSFUNC関数および%QSYSFUNC関数で使用できないSAS関数
すべての変数情報関数
ALLCOMB
ALLPERM
DIF
DIM
HBOUND
IORCMSG
INPUT
LAG
LBOUND
LEXCOMB
LEXCOMBI
LEXPERK
LEXPERM
MISSING
PUT
RESOLVE
SYMGET
注: INPUT関数やPUT関数は%SYSFUNC関数および%QSYSFUNC関数では使用できないため、代わりにINPUTN関数、INPUTC関数、PUTN関数、PUTC関数を使用してください。
注: 変数情報関数には、VNAME関数やVLABEL関数が含まれます。変数情報関数の完全な一覧については、SAS関数とCALLルーチン: リファレンスの関数とCALLルーチンの定義を参照してください。
注意:
SAS関数が返す値は切り詰められる場合があります。
マクロ変数により返される値はDATAステップにより定められている長さには制限されませんが、SAS関数により返される値はこの制限を受けます。

比較

%QSYSFUNC関数は、%NRBQUOTE関数と同じ文字をマスクします。

例1: TITLEステートメントでの現在の日付のフォーマット

次の例では、DATE関数とWORDDATE.出力形式を使用して、現在の日付を含むTITLEステートメントをフォーマットしています。
title "%sysfunc(date(),worddate.) Absence Report";
2008年7月18日にプログラムを実行した場合、次のTITLEステートメントが生成されます。
title "July 18, 2008 Absence Report"

例2: %SYSFUNCにより生成された値のフォーマット

次に示すマクロTRYは、PUTN関数とCATEGORY.入力形式を使用して引数PARMの値を変換します。
proc format;
  value category
  Low-<0  = 'Less Than Zero'
  0       = 'Equal To Zero'
  0<-high = 'Greater Than Zero'
  other   = 'Missing';
run;
%macro try(parm);
  %put &parm is %sysfunc(putn(&parm,category.));
%mend;
%try(1.02)
%try(.)
%try(-.38)
このプログラムを実行すると、次の行がSASログに書き込まれます。
1.02 is Greater Than Zero . is Missing -.38 is Less Than Zero

例3: 文字の変換

次の例では、%SYSFUNC関数でTRANSLATE関数を実行することにより、文字列内に含まれている文字Nを文字Pに変換します。
%let string1 = V01N01-V01N10;
%let string1 = %sysfunc(translate(&string1,P, N));
%put With N translated to P, V01N01-V01N10 is &string1;
このプログラムを実行すると、次の行がSASログに書き込まれます。
With N translated to P, V01N01-V01N10 is V01P01-V01P10

例4: SASデータセットの存在の確認

次に示すマクロCHECKDSは、%SYSFUNC関数を使用してEXIST関数を実行することにより、データセットが存在するかどうかチェックします。
%macro checkds(dsn);
   %if %sysfunc(exist(&dsn)) %then
      %do;
         proc print data=&dsn;
         run;
      %end;
      %else
         %put The data set &dsn does not exist.;
%mend checkds;
%checkds(Sasuser.Houses)
このプログラムを実行すると、次のステートメントが生成されます。
PROC PRINT DATA=SASUSER.HOUSES;
RUN;

例5: データセットの変数とオブザベーションの数の決定

1つのSASデータセット内に存在する変数とオブザベーションの数を取得するために、これまで多くのソリューションが作成されてきました。過去に作成されたソリューションのほとんどは、NULL_ DATAステップ、NOBS=オプション付きのSETステートメント、配列を組み合わせて使用することで、この情報を取得していました。現在は、OPEN関数およびATTRN関数を使用することにより、ステップ境界条件に干渉することなく、この情報を素早く取得できます。
%macro obsnvars(ds);
   %global dset nvars nobs;
   %let dset=&ds;
   %let dsid = %sysfunc(open(&dset));
   %if &dsid %then
      %do;
         %let nobs =%sysfunc(attrn(&dsid,NOBS));
         %let nvars=%sysfunc(attrn(&dsid,NVARS));
         %let rc = %sysfunc(close(&dsid));
         %put &dset has &nvars  variable(s) and &nobs observation(s).;
      %end;
   %else
      %put Open for data set &dset failed - %sysfunc(sysmsg());
%mend obsnvars;
%obsnvars(Sasuser.Houses)
このプログラムを実行すると、次のメッセージがSASログに書き込まれます。
sasuser.houses has 6 variable(s) and 15 observation(s).
前のページ|次のページ|ページの先頭へ