SAS入门 (二)--宏
SAS宏功能
將一個變量,一段程序或者一個文本命名,供以后調(diào)用,是用于擴充和制做用戶化SAS系統(tǒng)的工具;利用宏功能用戶可以減少在完成一些共同任務(wù)時必須輸入的文本量。當(dāng)用戶在某個SAS程序中使用宏功能時,這個宏功能產(chǎn)生所需要的SAS語句和命名,SAS系統(tǒng)的其余部份接受這些語句和命令。
- 獲取SAS的系統(tǒng)信息。SAS在啟動時就創(chuàng)建了一些自動宏變量,用以存儲當(dāng)前SAS進(jìn)程啟動的日期,時間,版本號及其它信息,用戶可以在任何情況下使用這些宏變量。
- 有條件的執(zhí)行數(shù)據(jù)步和過程步。例如每天提交一份生產(chǎn)情況的詳細(xì)報告,每周五增加一份匯總報告。使用宏功能每天運行同一個程序就可以實現(xiàn)上述任務(wù)。
- 開發(fā)交互式系統(tǒng)。使用SAS宏語言的%WINDOW語句及一些基本的編程語句可開發(fā)交互式用戶界面。
- 產(chǎn)生與數(shù)據(jù)無關(guān)的SAS程序,但可展示與數(shù)據(jù)相關(guān)的結(jié)果。宏功能可保持SAS程序的獨立性和移植性。一段程序在多種情況下均可運行,得到期望的結(jié)果。
- 在不同的SAS數(shù)據(jù)步和過程步之間傳遞數(shù)據(jù)。SAS宏變量可在SAS的任何地方被引用,具有全局性,所以成為不同過程間傳遞數(shù)據(jù)最方便的手段。
- 重復(fù)執(zhí)行SAS程序碼。凡用到SAS宏語言的變量和語言成分,都以符號%或&開始。當(dāng)SAS程序提交后,在編譯階段,系統(tǒng)對程序逐詞掃描過程中,凡遇到%或&開始的詞,就啟動宏語言處理器對此進(jìn)行處理。
宏變量
宏變量屬于SAS宏語言,但不同于DATA步變量。可以在SAS程序除數(shù)據(jù)行之外的任何地方定義并使用宏變量。一個DATA步變量僅與一個SAS數(shù)據(jù)集有聯(lián)系,而宏變量不依賴于SAS數(shù)據(jù)集。宏變量與數(shù)據(jù)步中變量的主要區(qū)別是,數(shù)據(jù)步中變量的值往往與被處理觀測有關(guān),而宏變量有唯一確定的值,一個宏變量存放的值保持不變直到被修改。
宏變量具有唯一確定的值,可以存儲字符串,是全局變量。可以在數(shù)據(jù)步中被引用,但不能在數(shù)據(jù)步中用賦值語句定義。引用時,在變量名前加“&”號,引用效果是變量值代替變量名。宏變量在引用時放在單引號之間不會被解讀,只能在雙引號之間。
SAS系統(tǒng)包含兩種類型的宏變量:
- 自動宏變量,由SAS系統(tǒng)提供;
- 用戶定義的宏變量,由用戶在程序中定義。
自動宏變量
在SAS進(jìn)程開始時,或程序運行過程中由系統(tǒng)自動創(chuàng)建,在SAS退出前一直保持有效,是全局宏變量,能在SAS任何地方被引用。以下是一些主要的自動宏變量:
SYSDATE SAS進(jìn)程開始的日期;
SYSDATE9 以Date9.格式顯示SAS進(jìn)程開始的日期;
SYSTIME SAS進(jìn)程開始的時間;
SYSSCP 使用的操作系統(tǒng);
SYSDAY SAS進(jìn)程開始是為星期幾;
SYSVER SAS的版本;
SYSLAST 最新創(chuàng)建的SAS數(shù)據(jù)集的名字;
定義宏變量
有兩種方式定義宏變量:%LET和call symput。定義宏變量并分配一個值給宏變量的最簡單方法是使用宏程序語句%LET。格式如下:
%LET 變量名=變量值;
另一個語句就是call symput,其格式如下:
call symput(變量名,變量值);
宏變量的引用
為了引用一個宏變量的值,放一個&號在宏變量名字的前面
模式&name成為宏變量的引用。用戶創(chuàng)建宏變量之后,可以在SAS程序中引用它。
%let exa=score;
title “display of student &exa”;
宏處理器用宏變量EXA的值替代&exa,SAS系統(tǒng)看到的是下面的TITLE語句:
title “display of student score”;
用戶根據(jù)SAS程序中的需要可以多次引用宏變量。宏變量的值保持不變直到其被修改。
每次出現(xiàn)引用&exa,宏處理器用score替代它
在上例中,如果用戶想要改變SAS數(shù)據(jù)集名字,可以在它出現(xiàn)的這段程序中通過改變宏變量的值來實現(xiàn)
%let exa=study.math;data temp; set &exa; if math>80; run;proc print; title "display of student &exa"; run;宏變量的特殊用法
- %STR 將一段程序賦給一個宏變量. %STR(SAS程序)
%let print = %str(proc print seashell.class;run;);
若賦值給宏變量的值浮腫含有引號,要加百分號處理
例如:
%let text = Paul%’s Report;
- %eval(表達(dá)式)
在 計算表達(dá)式的值,再將結(jié)果賦給宏變量
- %sysfunc 使用數(shù)據(jù)步函數(shù)(例如 substr\scan\trim\leet)
%sysfunc(數(shù)據(jù)步函數(shù)名(自變量),<輸出格式>)
宏
宏是一個被存貯的文本,用一個名字識別它。最簡單的宏就像一個宏變量一樣工作,但復(fù)雜的宏可以完成許多宏變量不能做的事。定義宏的語句格式為:
%MACRO 宏名稱;
宏文本
%MEND <宏名稱>;(默認(rèn)存放在work.sasmacr中);
%MACRO語句是每一個宏的開始,同時必須給出這個宏的名字。宏名字的命名準(zhǔn)則與SAS名字一樣。宏的文本也就是宏的內(nèi)容,宏內(nèi)的字符串稱為固定文本或模型文本,該文本將變?yōu)橛脩鬝AS程序的一部分。%MEND語句必須圍住每個宏并表示宏的介紹。%MEND語句也可以放上宏名字來說明該宏已結(jié)束。
宏的調(diào)用
為了調(diào)用一個宏,放一個百分?jǐn)?shù)符號(%)在宏名字前面就可以了,比如:%study
模式“%宏名稱”稱為宏的調(diào)用。當(dāng)用戶定義一個宏之后,可以在SAS程序中調(diào)用它,如:
Title “Display of school %study”;
宏處理器執(zhí)行宏STUDY,把宏里面的固定文本替代到TITLE語句中。TITLE語句變?yōu)?#xff1a;
Title “Display of school Student score”;
SAS程序可以包括任意多個宏,且在一個程序中可以多次調(diào)用一個宏。對于簡單文本的闡明,使用宏變量比定義一個宏更有效。然而,當(dāng)任務(wù)比較復(fù)雜時,宏比宏變量更有優(yōu)勢。
把宏變量和宏結(jié)合在一起,將給出一種用宏工具編程的強有力的方法。下面我們將介紹在宏中使用宏變量的多種方法
宏參數(shù)
可以定義宏變量作為%macro語句的一部分,如:
%macro printClass(class);
proc print data=&class;
run;
%mend printClass;
被定義在一個%macro語句括號內(nèi)的宏變量稱為宏參數(shù)。當(dāng)調(diào)用這個宏時只要給出這些參數(shù)的值, %printClass(sashelp.class)
宏處理器把第一個值給第一個宏變量名字,第二個值給第二個宏變量名字,以此類推(因此這些參數(shù)也稱為位置參數(shù))。以上這個宏執(zhí)行后生成下面語句:
proc print data=sashelp.class; run;
對參數(shù)分配的值只在這個宏執(zhí)行過程中有效。因此第二次調(diào)用宏時,還是要給出參數(shù)的值。宏參數(shù)是局部宏變量的一個例子。而宏變量是從用戶創(chuàng)建它們直到SAS作業(yè)或SAS會話結(jié)束都存在;故前面介紹的宏變量為全局宏變量。
使用參數(shù)有以下幾個優(yōu)點:
用戶可以少寫幾個%LET語句;
調(diào)用宏時不需要知道這些參數(shù)的名字,只需要提供這些值的類型;
使用參數(shù)可以保證該變量在宏之外的程序部份不會被引用。
宏的條件結(jié)構(gòu)
%if 條件 %then 語句;
%if 條件 %then %do;語句組; %end; %else %do;語句組; %end;例如:
%macro link(judge, math,phy);title; %if judge=yes %then %do; %data;title 'data for plot'; %end; %plot; %mend link;宏的循環(huán)結(jié)構(gòu)
宏的循環(huán)語句有三種類型,分別是
宏中DO循環(huán)語句的格式為:
%do 指標(biāo)變量=始點 %to 終點(BY 增量);
文本或宏程序語句;
%end;
%do %while(表達(dá)式); /先判斷再執(zhí)行/
文本;
%end;
%do %until(表達(dá)式); /先執(zhí)行再判斷/
文本;
%end;
總結(jié)
以上是生活随笔為你收集整理的SAS入门 (二)--宏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决从PDF复制到Word中的英文字母变
- 下一篇: 新版macbook,PPT导出PDF复制