繁体   English   中英

数据步骤内的宏执行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM