循环在此代码中如何工作?为什么调用执行没有循环结束而工作?

时间:2019-04-15 17:40:27

标签: sas

需要了解为什么每次执行都在循环外时调用执行为什么起作用?变量名每次都会被覆盖,因此我应该获取数据集中最后一个变量的结果,而不是所有111个变量的结果。

data _null_; 
set basel.Data_Dictionary; 
do i =1 to 111 ;
call symput('Varname',NAME); 
%put &varname.; 
end;
call execute ('%missimp(&varname.)'); 
run;

1 个答案:

答案 0 :(得分:1)

不确定循环外的含义吗?

程序要做的第一件事是在数据_null_步骤开始之前将宏变量VARNAME的值打印到日志中。请注意,首先处理宏代码,然后将结果文本解释为您要运行的SAS代码。将%put语句放在data语句之前,会减少混乱。

您的数据步骤将“循环”您源数据集中的每个观察值。它将从您的输入数据中读取观察值。 DO循环将导致它将宏变量VARNAME设置为相同的值111倍。然后,它将调用名为MISSIMP的宏,该宏将使用VARNAME的值(在CALL EXECUTE语句运行时)。这将重复直到SET语句尝试读取输入数据集的末尾为止。所有这些宏调用将在当前数据步骤完成后运行。

一个简单得多的过程就是跳过CALL SYMPUT语句,并使用NAME的值生成代码以传递给CALL EXECUTE。像这样:

data _null_; 
  set basel.Data_Dictionary; 
  call execute(cats('%missimp(',NAME,')')); 
run;