第七章 MACRO語言

概述:
1:延伸SAS SYSTEM的功能並增加使用的親和性
2:減少大量文字的輸入
3:所謂巨集:是將一群文字或程式語言記錄在一 起,而能以一簡單的操作程序,使巨集包含的功能一次展出

MACRO VARIABLES巨集變數
巨集變數屬於巨集語言,而不同於DATA步驟的變數,可在 程式中的任何地方使用,除了資料行中。巨集變項含有的值會 一直保存,直到被改變為止。

data newdata;
  input age height @@;
cards;
1 70 2 80 4 90 12 105 14 120 15 160
 20 170 25 175 30 176 37 176 45 175 47 175
;
定義並指定值給一個巨集變數最簡單的方式是使用%LET
%let dsn=Newdata;
其中DSN是巨集變數,而newdata是它的值,巨集變數的值都是”字串”。

使用巨集變數時,只要在巨集變數名稱前加上”&”的符號
title "以下展現的資料集是 &dsn";
SAS在執行時會將&dsn展開,SAS看到title敘述看成:
TITLE "以下展現的資料集是 Newdata";
可以多次使用一個巨集變數:

-----------------------------------
data temp;
  set &dsn;
  if age>=20;
proc print;
  title "資料集 &dsn 的部份資料";
run;

SAS看成:
DATA TEMP;
  SET NEWDATA;
  IF AGE>=20;
PROC PRINT;
  TITLE "資料集 Newdata 的部份資料";
RUN;

-----------------------------------
建立含有SAS敘述的巨集變數plot
%let plot=%str(
  proc gplot;
  plot height*age;
  run;
  );

使用PLOT巨集變數
data temp;
  set &dsn;
  if age>=20;
&plot
proc print;
  title "資料集 &dsn 的部份資料";
run;

SAS看成:
DATA TEMP;
  SET NEWDATA;
  IF AGE>=20;
PROC PLOT;
  PLOT HEIGHT*AGE;
RUN;
PROC PRINT;
  TITLE "資料集 Newdata 的部份資料";
RUN;
-----------------------------------
使用巢氐巨集:
%let dsn=Newdata;
%let yvar=height;
%let xvar=age;
%let plot=%str(
  proc gplot;
  plot &yvar*&xvar;
  run;
  );
data temp;
  set &dsn;
  if age>=20;
&plot
proc print;
  title "資料集 &dsn 的部份資料";
run;

經過SAS巨集變項的解析過,SAS看成
DATA TEMP;
  SET NEWDATA;
  IF AGE>=20;
PROC PLOT;
  PLOT HEIGHT*AGE;
RUN;
PROC PRINT;
  TITLE "資料集 Newdata 的部份資料";
RUN;
-----------------------------------
定義巨集:
%macro dsn;
  Newdata
%mend dsn;
其中DSN是巨集名稱,而newdata是它的定值。

使用巨集時,只要在巨集變數名稱前加上”%”的符號
title "以下展現的資料集是 &dsn";
SAS在執行時會將&dsn展開,SAS看到title敘述看成:
TITLE "以下展現的資料集是 Newdata";


建立含有SAS敘述的巨集plot
%macro plot;
  proc gplot;
  plot height*age;
  run;
%mend plot;

使用PLOT巨集
data temp;
  set &dsn;
  if age>=20;
%plot
proc print;
run;

SAS看成:
DATA TEMP;
  SET NEWDATA;
  IF AGE>=20;
PROC PLOT;
  PLOT HEIGHT*AGE;
RUN;
PROC PRINT;
RUN;
定義(%LET)巨集變數:
  %LET var=height;
  %LET var=  height  ;
  %LET var=
             height;
  %LET tot=100+200;

  %LET city=;

  %LET stret=研究院路;
  %LET num= 128;
  %LET address= &num &street 台北南港 ;

  %LET title=%str(title "台北南港研究院路128號"; );

使用(&)巨集變數:
  %LET vname=Price;
  title "Study of &vname over time";
  title 'Study of &vname over time';
  放在字串中的巨集變項請用雙引號,
  否則無法解開巨集變項的內容。

%let name=sales;
  new&name          -> newsales
  save.&name          -> save.sales
  in&name.temp          -> insalestemp
  in&name..temp          -> insales.temp


定義和使用巨集:
定義:%MACRO name; ....... %MEND;
使用:%name;
  %MACRO name; ..... %MEND;  
     -> %name
  %MACRO name1(a,b,c); ..... %MEND;  
     -> %name1(as,,at)
  %MACRO name2(z,w,x=x1,y=y1); ..... %MEND;
     -> %name2(az,aw)
     -> %name2(az,aw,y=ay)

SYMGET函數(取得巨集變項值)的使用
  %LET a1=begin;
  %LET a2=end;
  %LET a3=continue;
  data one;
    lenth key $ 8;
    input code $ @@;
    key=symget(code);
    cards;
  a1 a1 a2 a3 a1 a2
  ;
  proc print;
    title "Data set procedured using SYMGET";
  run;


SYMPUT函數(建立巨集變項)的使用
  data aa;
    set sasuser.class end=last;
    if height >=130 then p+1;
    if last then call SYMPUT('ht',left(p));
  run;
  title "資料中身高130以上者有 &ht 位" ;
  proc print;
  run;

%INC 'filename';   -> 包函外部片段程式