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
使用巨集變數時,只要在巨集變數名稱前加上”&”的符號
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'; -> 包函外部片段程式