data ex;
input x;
cards;
1
2
3
;
run;
%macro prob(prob=,newdata=);
data temp; /*这里举个简单的例子,让ex表中x乘以prob,并放入到temp表中*/
set ex;
x=x*&prob;
run;
%if %sysfunc(exist(&newdata)) eq 0 %then %do;/*这里判断新表是否存在,如果不存在,新建新表,set上述temp表*/
data &newdata;
set temp;
run;
%end;
%else %do; /*如果新表存在,将新表与temp纵向连接,并覆盖新表*/
data &newdata;
set &newdata temp;
run;
%end;
%mend;
/*以如下方式实现,初始阶段,没有out这张表*/
%prob(prob=1,newdata=out);/*out表不存在,data out;set temp;run;*/
%prob(prob=10,newdata=out);/*此时out表已存在,data out;set out temp;run*/
%prob(prob=100,newdata=out);/*此时out表已存在,data out;set out temp;run*/
/*最终out表中有9个观测,分别为
1
2
3
10
20
30
100
200
300*/
/*若将1,10,100三个乘数放在ex1表中,以call execute实现上述过程*/
data ex1;
input y;
cards;
1
10
100
;
run;
options mprint;
data _null_;
set ex1;
call execute('%prob(prob='||y||',newdata=out)');
run;
/*最终out表中数据仅有三行
100
200
300*/
/*解析出的代码如下
data temp;x=x*1;run;
data out;set temp; run;
data temp;x=x*10;run;
data out;set temp; run;
data temp;x=x*100;run;
data out;set temp; run;
即第一步解析出out表不存在,生成out表;
然而在第二步时,并不去判断out表是否存在,仍然用第一步解析出的代码,
第三步同样*/
我猜想call execute 在调用宏时,只在一开始对宏解析一次,接下来便不再解析。
不知道这样的猜想对不对,希望清楚的朋友,能够指点一下,十分感谢!