SAS | 宏(Macro)基础知识
1 概述
1.1 宏程序的两个基本部分
- 宏 :命名型宏(name-style macros)的宏名称带“%”符号前缀。
- 例外
- 另外两种类型的宏不以%开头:命令型(command-style)和语句型(statement-style)。一般来说, 以前缀开头的宏 比 没有前缀的宏 优先级更高,因为更有效(宏处理器更快识别),且不易与SAS关键字混淆。
- %INCLUDE、%LIST和%RUN语句不属于宏。
- 宏变量 :宏变量名称带“&”符号前缀
1.2 局部宏变量与全局宏变量(根据作用范围的不同)
一般情况下,局部宏变量是在宏中定义的,仅可以在自己的宏中使用 [1] 。
在“开放代码” [2] 中定义的宏变量往往是全局的,可在程序的任何位置使用。
常见错误 :
- 试图在宏以外使用局部宏变量
- 创建的局部宏变量与全局宏变量的名称相同
1.3 宏系统选项——确保宏处理器处于开启状态
在使用宏之前,必须将MACRO系统选项开启。
在默认情况下,这个选项通常已经开启了,但也有可能被关闭,特别是在大型机上,因为SAS在不检查宏时运行速度会更快。如果不确定MACRO系统选项是否开启,可提交代码确定:
PROC OPTIONS OPTION=MACRO;
RUN;
下面五类系统选项影响SAS将什么消息输出到日志, 粗体 为default:
- MERROR | NOMERROR:若开启,当调用找不到的宏时,发出警告【WARNING:没有解析宏“???的调用。】
- SERROR | NOSERROR:若开启,当使用找不到的宏变量时,发出警告【WARNING:没有解析符号引用???。】
- MLOGIC | NOMLOGIC :若开启,在Log中打印有关宏的详细执行情况
- MPRINT | NOMPRINT :若开启,在Log中打印由宏生成的标准SAS代码
- SYMBOLGEN | NOSYMBOLGEN :若开启,在Log中打印宏变量的值
打开或关闭系统选项,在PROC OPTIONS OPTION=后输入以上十个中的任意几个即可。
2 用宏变量替换文本
遇到宏变量名称时,宏处理器简单地用宏变量的值 [3] 替换该宏变量的名称。
意义:批处理,文本替换量大时更方便
2.1 使用%LET语句创建宏变量(最简单的方式)
一般形式:
%LET macro-variable-name=value;
Attention :与普通的赋值语句不同,value不需要引号,即使包含字符串也不需要,等号和分号之间的所有内容都会成为该宏变量值的一部分
2.2 使用宏变量
宏处理器不会查找单引号内的宏,可用双引号:
%LET iterations=10;
%LET country=New Zealand;
DO i=1 to &iterations;
TITLE "Addresses in &country";
3 拼接宏变量与其他文本
3.1 拼接文本与宏变量
SAS遇到“&”符号时开始查找宏变量名,将到部分符号为止的字符作为宏变量名。
休止符号 :
- 空格
- 句号
- 分号
- 另一个“&”符号
Attention :
- 将两个宏变量连接在一起不需要在两个宏变量名间增加句点,因为第二个宏变量的“&”符号表示第一个宏变量的结尾。
- 句点表示宏变量的结尾,解析文本不会将其包含在内
3.2 自动宏变量
每次调用SAS时,宏处理器自动创建的某些宏变量,可以直接使用:
4 创建模块代码
一般形式(不带参数) :
%MACRO macro-name;
macro-text
%MEND macro-name; /*macro-name是可选的,有的话便于宏的调试和维护*/
%macro-name; /*调用宏*/
5 添加参数
参数:在调用宏时,所设定的宏变量的值
%MACRO macro-name (parameter-1= ,parameter-2= , … parameter-n= );
macro-text
%MEND macro-name;
macro-text使用时在参数前加&
6 编写带条件逻辑的宏
宏语句只能在宏中使用,大部分宏语句在标准SAS代码中有对等语句,如%IF。
一般形式 :
%IF condition %THEN action;
%ELSE %IF condition %THEN action;