SAS讲义-第十一课.doc_第1页
SAS讲义-第十一课.doc_第2页
SAS讲义-第十一课.doc_第3页
SAS讲义-第十一课.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SAS讲义-第十一课宏语言SAS宏的功能:将一个变量,一段程序或者一个文本命名,供以后调用,是用于扩充和制做用户化SAS系统的工具;利用宏功能用户可以减少在完成一些共同任务时必须输入的文本量。简单地说,就是把重复性的工作模块化!一、宏变量宏变量的定义方法是:%let 宏变量名=宏变量值;宏变量的引用方法是:&来引用。例1 %let x=30;data a;m=&x;run;当SAS程序提交后,在编译阶段,系统对程序逐词扫描过程中,凡遇到%或&开始的词,就启动宏语言处理器对此进行处理。例2 data score;input math;cards;71 81 91; run;%let exa=score;data temp;set &exa;if math80;run;二、宏程序宏程序简称宏,是一个被存储的文本,最终都会被编译并执行。但是宏不是一个简单的文本,它可以通过控制和循环语句来控制文本的输出。另外,宏还包含参数,通过调用不同的参数值可以多次重复使用宏,从而简化程序的开发工作。一个宏程序最终被系统的编译器执行,中间需要经过三个步骤:1)定义宏:创建一段程序文本。2)编译宏:运行这段文本;运行的结果将存储到SAS宏目录。该阶段系统只编译不解析。3)调用宏:从宏目录中调用一个宏名字。系统解析宏程序,将解析结果传至编译器,执行具体的程序语句。1、宏定义的格式:%macro test;Data a;X=1;Run;%mend test;在格式中,%macro是定义宏的关键字,test是宏的名字,%mend是宏定义结束的标志。夹在%macro和%mend的文本是宏的主体信息,该例子实际上定义了一个名为test的宏,主体信息是一个data步。2、调用宏的格式如果调用上例的宏,即为:%test;3、宏内宏一个宏内可以再嵌套一个宏。例3%macro test;Data a;X=1;Run;%mend test; /*定义了一个名为test的宏*/%macro prt;Proc print data=sashelp.class;run;%mend prt; /*定义了一个名为prt的宏*/%macro nest;%test;%prt;%mend nest; /*定义了一个名为nest的宏,其主体是调用另外两个宏*/%nest; /*调用名为nest的宏*/三、宏参数从上面看似乎宏只是一些文本的堆彻,其实不是,宏参数将发挥重要的作用。宏参数是一种特殊的宏变量,是定义在宏macro语句内的宏变量。例4%macro abc(x,y);data test;x=&x;y=&y;run;%mend add;%abc(1,3);该例子中x与y就是宏参数。例5data class;input a b;cards;31 7676 9262 37;run;%macro printClass(c); proc print data=&c; run;%mend printClass;%printClass(class);该例子创建了一个专门用于输出数据集的宏函数,以后可以重复调用。四、宏语句宏有了宏参数,编程工作简化了,但是还不够,下面介绍在宏里面使用控制循环语句。1、%if-%then/%else这里的%if-%then/%else语句功能和SAS的if-then/else一样,只是前者在宏程序中执行,而后者在data步中执行。但是前者执行结果是产生一个文本,而后者是执行一个具体的程序。例6%macro obs(parm); %let parm1 = %upcase(&parm); %if &parm1 = PRE %then %do; data pre_obs; set sashelp.class(obs=5); if sex=M then y=1; else y=2; run; %end; %else %if &parm1 = POST %then %do; data post_obs; set sashelp.class(firstobs=6); if sex=M then y=1; else y=2; run; %end;%mend obs;%obs(pre);分析:1)系统定义了一个有参数的宏,参数是parm。2)接下来,语句%let parm1 = %upcase(&parm);定义了一个局部宏变量parm1。所谓局部也就是说只在在该宏里面有作用。同时,通过宏函数%upcase引用了宏参数parm的值。%upcase()是一种宏字符函数,关于宏函数我们还要说,这里就是讲括号里的内容转为大写字符。3)宏语句%if &parm1 = PRE判断引用宏变量parm1的值是否等于一个指定的文本PRE,如果条件成立,则执行%then语句,产生介于%do语句和%end语句之间的一段文本程序。否则,执行%else语句,产生下面的另外一段文本程序。这两段文本程序都是一个data步。4)定义完毕后,通过调用%obs(pre),parm得到一个具体的参数值pre,显然系统经过宏处理器满足第一个if条件,最后返回的文本应该是下面的一段程序:data pre_obs; set sashelp.class(obs=5); if sex=M then y=1; else y=2; run;5)返回这段文本后,系统结束宏处理器的流程,开始进入SAS编译器编译,最终执行data步程序,而在data步例的if-then/else语句才是SAS编译器执行的语句。%do-%end在这里的作用仅仅是产生一段文本,该文本就是两者之间的内容。2、%Do循环语句例7%macro create(howmany); %do i=1 %to &howmany %by 2; data class&i; set sashelp.class(obs=&i.);/* i后面的点并没有实质意义*/ run; %end;%mend create;%create(5);分析:这段宏程序会产生3段文本,其等价的代码如下:data class1; set sashelp.class(obs=1); run; data class3; set

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论