CALL EXECUTE的用法
(2014-07-03 22:11:23)
标签:
sascallexecute |
分类: SAS笔记 |
对call execute的用法描述:解析其包含的语句,并且在下一个过程步或者data步中运行(如果解析值是一个SAS语句)或者立即运行(如果解析值是一个宏语句)。
很多情况下,CALL EXECUTE()可以实现宏的效果。使用宏,我们需要“定义宏”+“调用宏”;使用CALL EXECUTE(),我们可以在DATA步的执行过程中,根据变量的值生成不同的代码,而这些代码会在DATA步执行完后自动运行。
比如,下面的例子可以求出数据集中数值型变量的描述性统计和字符型变量各个值的频数:
data _null_;
run;
如果CALL EXECUTE()的参数值只包含SAS语句的话,理解起来是比较简单和直观的。但如果其参数值包含宏的因素(宏变量,宏语句,宏的调用)时,理解起来就可能比较困难,难点就在于究竟宏变量的值是什么时候解析的,以及宏语句是什么时候被执行的。
CALL EXECUTE() 中的宏变量
下面这个例子可以用来说明CALL EXECUTE()中宏变量的解析情况:
%macro test(aa);
%mend;
%let aa=Good;
data _null_;
run;
程序解释:
数据集TEST中变量X的值:
第一个CALL EXECUTE()所产生的数据集中 X的值为’bad’。这是因为当宏的调用放到双引号中时,宏的执行是在DATA步的编译阶段进行的。而宏执行的结果(’data test’ 代码)再放到一对双引号之间作为CALL EXECUTE() 的参数。这就相当于:
call execute("data test; x='&aa';
y=symget('aa'); put x= y=; run;");
call execute("data test; x='bad'; y=symget('aa');
put x= y=; run;");
数据集TEST中变量Y的值:'Good'
因为SYMGET()函数的参数只是宏变量的名字'aa'而不用符号’&’,因此在DATA
另外,如果希望SYMGET()函数返回宏%test所指定的参数值,可以用:
call
a.
b.
这就相当于DATA步执行完毕后直接调用宏:%test(bad)
如果CALL
1.如果宏语句在双引号中并没有使用%NRSTR(),宏语句会在DATA步编译阶段执行;
2.如果宏语句在单引号中,或者在双引号中并使用了%NRSTR(),宏语句会在DATA步执行阶段执行;
3.如果宏语句在单引号中,并且使用了%NRSTR(),则宏语句会在DATA步执行完之后执行。
对下面这个例子也可以同样解释:
data
prices;
56 300
99 10000
24 225
;
%macro items;
%mend items;
data
sales;
run;
结果在log中显示为
&special
&special
&special
但是如果将代码中的call execute('%items');改成call execute("%items");则可以得到另外一个结果:
football
football
football
从这个例子中可以看出单引号和双引号的区别所在。