1. SAS 中的宏
SAS 中的宏就是一些功能的抽象,比如在一个程序中需要多次使用画图的程序,但是每次都写 plot 语句,太过于麻烦,所以这个时候,就需要抽象出一个通用的 SAS 宏来解决这个问题。
(1)SAS 的宏
Q:什么是宏?
A:就是其他语言中所说的函数,功能。
Q:如何定义一个宏?
A:格式是以” %macro 宏名;“开始,然后以“%mend 宏名;”结束。
(2)SAS 的宏变量
Q:什么是宏变量?
A:首先宏是脱离 data 步的,所以对于宏变量而言,只需要定义了,在整个 SAS 程序中就可以使用,相当于一个不变的变量,在定义之后,就可以直接使用。
Q:宏变量该如何定义?
A:格式是 %let 变量名-= 变量值;
Q:宏变量在定义之后,如何使用呢?
A:变量在定义之后,都是用来被使用的,所以,在引用宏变量的时候,只需要 &宏变量名,这样即可。
(3)SAS 的宏参数
Q:什么是宏参数?
A:任何函数或者是功能,可能参数不同,但是功能是一样的,比如说吃饭这件事,对于老虎来说,吃饭吃的是肉,但是对于绵羊而言,吃得就是草。而宏参数就是传进来的参数。
Q:宏参数应该如何使用?
A:在创建宏的时候,在宏名的后面加一个括号,形如:%macro add(var1=name,var2=subname);其中 var1 和 var2 就是宏参数。
例子:
1 data mydata; 2 input name $ age gender $; 3 cards; 4 a 12 male 5 b 13 female 6 c 14 male 7 ; 8 run; 9 10 /* 创建一个数据集 */ 11 %macro create; 12 data copy_data; 13 set mydata; 14 if gender = 'male'; 15 %mend create; 16 17 /* 引用 init 宏 */ 18 %create; 19 run; 20 21 proc print data = mydata; 22 title '原始数据集'; 23 run; 24 25 proc print data = copy_data; 26 title '筛选后数据集'; 27 run;
要注意的是,在宏中是无法使用创建数据集的,就是说,在宏中是无法使用cards 这样的语句来创建数据集。
例子中使用了两次 print 数据,但是数据集名不一样,这个时候就可以使用宏参数了。
改进版例子:
1 data mydata; 2 input name $ age gender $; 3 cards; 4 a 12 male 5 b 13 female 6 c 14 male 7 ; 8 run; 9 10 /* 创建一个数据集 */ 11 %macro create; 12 data copy_data; 13 set mydata; 14 if gender = 'male'; 15 %mend create; 16 17 /* 引用 init 宏 */ 18 %create; 19 run; 20 21 /* 打印数据集,宏参数为数据集名称 */ 22 %macro print(dataset); 23 proc print data = &dataset; 24 run; 25 %mend print; 26 27 /* 引用 print 宏 */ 28 %print(mydata); 29 run; 30 31 %print(copy_data); 32 run;
需要注意一下的是:
在使用宏参数的时候,会遇到下列几种情况。
(1)对于参数没有初始值的时候,直接填写参数名,形如:print(dataset)
(2)对于参数需要使用初始值的时候,需要在参数名后面接上初始参数值,形如:print(dataset = mydata)
(3)在给定初始参数值之后, 在调用函数的时候,如果想要改变参数值,直接使用 print (dataset = 指定值),这里的指定值与初始值应该不同