2-SAS宏编程

SAS宏编程

  • 定义与用途
  • 宏变量

一、定义与用途

(一)定义

将一个变量,一段程序或者一个文本命名,供以后调用,是用于扩充和制做用户化SAS系统的工具。

(二)用途
  1. 获取SAS的系统信息
  2. 有条件的执行数据步和过程步
  3. 开发交互式系统%WINDOW
  4. 产生与数据无关的SAS程序,但可以展示与数据相关的结果
  5. 重复执行SAS程序码

二、宏变量

(一)概念
  1. 宏变量属于SAS宏语言,但不同于DATA步变量。其不依赖于SAS数据集,一个宏变量存放的值保持不变直到被修改(全局变量)。
  2. 引用时,变量名前加上"&"。
  3. 宏变量在引用时放在双引号之间会被解读(单引号不会被解读)。
(二)宏变量的产生
  • 自动宏变量:由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;

结果
2-SAS宏编程

  • 创建包含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

结果
2-SAS宏编程

  • 嵌套宏变量
%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)

结果
2-SAS宏编程

(三)宏参数

可以定义宏变量作为%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;

2-SAS宏编程