2-SAS宏编程
SAS宏编程
- 定义与用途
- 宏变量
- 宏
一、定义与用途
(一)定义
将一个变量,一段程序或者一个文本命名,
供以后调用
,是用于扩充和制做用户化SAS系统的工具。
(二)用途
- 获取SAS的系统信息
- 有条件的执行数据步和过程步
- 开发交互式系统
%WINDOW
- 产生与数据无关的SAS程序,但可以展示与数据相关的结果
- 重复执行SAS程序码
二、宏变量
(一)概念
- 宏变量属于SAS宏语言,但不同于DATA步变量。其
不依赖于SAS数据集
,一个宏变量存放的值保持不变直到被修改(全局变量
)。 - 引用时,变量名前加上"&"。
- 宏变量在引用时
放在双引号之间会被解读
(单引号不会被解读)。
(二)宏变量的产生
- 自动宏变量:由SAS系统提供
-
用户定义的宏变量
:用户定义
用户定义的宏变量,两种格式:
%LET 变量名=变量值;
call symput(变量名,变量值);
(三)宏变量的引用
- 替换的概念
//ex
%let exa=score;
title “display of student &exa”;
//等价于 title “display of student score”;
- 多次引用宏变量
data score;
input [email protected]@;
cards;
71 81 91
; run;
%let exa=score;
data temp;
set &exa; /*第一次*/
if math>80;
run;
proc print;
title "display of student &exa"; /*第二次*/
run;
结果
- 创建包含SAS语句的宏变量
%let print=%str(
proc print;
run;
);
%let exa=score;
data score;
input [email protected]@;
cards;
71 81 91
;
run;
data temp;
set &exa;
if math>80;
run;
&print
结果
- 嵌套宏变量
%let exa=score;
%let xvar=math;
%let yvar=phys;
%let plot=%str(
proc plot;
plot &xvar*&yvar;
run;
);
data score;
input math [email protected]@;
cards;
91 81
98 65
70 92
;
run;
data temp;
set &exa;
run;
&plot
三、宏
(一)宏的定义
宏是一个被存贮的文本,用一个名字识别它。
最简单的宏就像一个宏变量一样工作,但复杂的宏可以完成许多宏变量不能做的事。
定义宏的语句格式为:
%MACRO 宏名称;
宏文本
%MEND <宏名称>;(默认存放在work.sasmacr中);
%MACRO
语句是每一个宏的开始,同时必须给出这个宏的名字。宏名字的命名准则与SAS名字一样。宏的文本也就是宏的内容,宏内的字符串称为固定文本或模型文本,该文本将变为用户SAS程序的一部分。%MEND
语句必须围住每个宏并表示宏的介绍。%MEND
语句也可以放上宏名字来说明该宏已结束。
(二)宏的调用
为了调用一个宏,放一个百分数符号(%)在宏名字前面就可以了。比如:%study
模式“%宏名称”称为宏的调用。当用户定义一个宏之后,可以在SAS程序中调用它,如:
Title “Display of school %study”;
Title “Display of school Student score”;
实例
data sashelp.class;
run;
%macro printClass(class);
proc print data=&class;
run;
%mend printClass;
%printClass(sashelp.class)
结果
(三)宏参数
可以定义宏变量作为%macro语句的一部分,如:
%macro printClass(class);
proc print data=&class;
run;
%mend printClass;
被定义在一个%macro语句括号内的宏变量称为宏参数。当调用这个宏时只要给出这些参数的值。
%printClass(sashelp.class)
宏处理器把第一个值给第一个宏变量名字,第二个值给第二个宏变量名字,以此类推(因此这些参数也称为位置参数)。以上这个宏执行后生成下面语句:
proc print data=sashelp.class;
run;
(四)宏的循环结构
宏的循环语句有三种类型,分别是——
- 宏中DO循环语句的格式为:
%do 指标变量=始点 %to 终点(BY 增量);
文本或宏程序语句;
%end;
%do %while(表达式); /*先判断再执行*/
文本;
%end;
%do %until(表达式); /*先执行再判断*/
文本;
%end;
实例(可能你需要一些数据文件)
%macro create (name, number);
%do n=1 %to &number;
&name.n
%end;
%mend create;
data %create(abc,3);
input [email protected]@;
if a=1 then output abc1;
else if a=2 then output abc2;
else if a=3 then output abc3;
cards;
1 2 3
;
proc print data=abc1;
run;
proc print data=abc2;
run;
proc print data=abc3;
run;
(五)宏调用宏
data score;
input math phy Eng;
cards;
87 67 87
78 96 84
95 69 65
;
run;
%macro data;
data temp;
set score;
run;
%mend data;
%macro plot;
proc plot;
plot math*phy;
run;
%mend plot;
%macro link(math,phy);
%data
%plot
%mend link;
%plot;
%data;