[英]Macro execution inside data step
我将在数据步骤中使用以下宏:
%global var3;
%macro add(var1,var2);
%let var3 = %eval(&var1+&var2);
%mend;
我不明白以下数据步骤的结果:
%let var3 = 2;
data test;
put "The value of var3 is &var3";
x = 3 - &var3;
%add(7,3);
%put &=var3;
run;
据我了解,宏语句是在编译数据步骤之前执行的。 所以在这种情况下,宏 %add 先执行,然后 %put 语句。 但是,x 的值为 1,而不是 -7。 并且还把语句打印出来 var3 的值是 2,而不是 10。我很困惑。
让我们看看会发生什么。
69 %global var3;
70
71 %macro add(var1,var2);
72 %let var3 = %eval(&var1+&var2);
73 %mend;
74
75 %let var3 = 2;
76 options symbolgen mprint;
77 data test;
SYMBOLGEN: Macro variable VAR3 resolves to 2
78 put "The value of var3 is &var3";
79 x = 3 - &var3;
SYMBOLGEN: Macro variable VAR3 resolves to 2
80 %add(7,3);
SYMBOLGEN: Macro variable VAR1 resolves to 7
SYMBOLGEN: Macro variable VAR2 resolves to 3
81 %put &=var3;
SYMBOLGEN: Macro variable VAR3 resolves to 10
VAR3=10
82 run;
The value of var3 is 2
所以,SAS 去运行宏传递,正如你在数据步骤编译之前所说的,并将代码变成这样......
data test;
put "The value of var3 is 2";
x = 3 - 2;
%let var3 = %eval(7+3);
%put 10;
run;
SAS 在编译之前处理宏语言是对的,但这并不意味着它发生在 SAS 开始准备编译数据步骤之前。 宏语言传递创建了最后的数据步骤,但它仍然按顺序发生——所以 SAS 查看第 77 行,没有看到宏变量,完成它; 它查看第 78 行,看到 &var3,将其变成 2,最终确定该行; 查看第 79 行等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.