基本上我正在写一个宏,将作为参数我的输入表,输出表和一个变量列表。我的变量列表显示为一个参数,为此我使用空格字符作为分隔符。 我的宏应该将我的列表分隔成nbvar宏 - 变量,它将包含我的(SAS)变量的名称。然后,我使用datastep将我的(SAS)变量从其原始字符格式输入到数值中。SAS宏:循环来创建变量
这里是我的一段代码:
%macro convert_car_to_num(input,output,listvar);
/* First I split my list into nbvar variables named var&i
%qscan to avoid macro resolution of names, not really necessary here
but still works fine. My delimiter is space character, hence
%str() in the %qscan*/
%let nbvar=%sysfunc(countw(&listvar));
%do i = 1 %to &nbvar;
%let var&i=%qscan(&listvar,&i,%str());
%end;
/*Here is my data step. &&var&i_num is resolved just fine*/
data &output;
set &input;
%do i = 1 %to &nbvar;
&&var&i.._num = input(&&var&i,BEST16.);
%end;
run;
%mend;
由于& &变种&我.._ NUM和& & VAR &我都解决了,我希望我的代码工作,但我的日志显示:
varname_num
解析名称“varname”加下划线。我发现后有一点点:
错误180-322:语句无效或使用不正确的顺序。
这通常是错位分号的标准错误。然而,我知道我的宏观变量都解决了,因为MPRINT显示:
MPRINT(CONVERT_CAR_TO_NUM):(varname的,BEST16)varname_num =输入
注:受宏观变量 “VAR26” 行产生。
MPRINT(CONVERT_CAR_TO_NUM):run;
其中,varname是我列表中第26个变量的正确名称,表示分辨率工作得很好。
为了让我更无法理解的,同一段代码,我将表明:
&&var&i.. = input(&&var&i,BEST16.);
DOES编译,即使它不符合预期的结果结束(变量仍然是char )。
类似地,用相同的代码:
&&var&i.._num = &&var&i;
不任一编译。
我也测试了改变我的宏观变量的名称num_ & & &变种i或n & &变种&我,甚至是第一次声明一个宏观变量“名”,其中将包括& & VAR &我,都是为了同样的效果。不选择与初始变量相同的名称似乎会导致代码显示180错误。
我想问题在于试图声明一个变量,知道我写的以前和类似的一段代码确实有效,datastep是一个比较(将变量列表中的缺失值也变为零) :
data &output;
set &input;
%do i = 1 %to &nbvar;
if &&var&i = . then &&var&i = 0;
%end;
run;
但对于这种同一段代码,如果我尝试(使用任何名称再次,对于这个问题)创建一个新的变量,写作:
if num_&&var&i = . then &&var&i = 0;
我发现我自己的解决名称再次加下划线,但现在指向以下错误:
ERROR 22-322:语法错误,在需要下列之一:,!!,&,(,*,**,+, - ,/,;,<, < =,<> =,>,> =,AND,EQ,GE,GT,IN,LE,LT,MAX,MIN,NE,NG,NL,NOTIN,OR [,^ =,{,|,||, ,〜=。
我一直在抓我的头,浏览网无济于事,所以谢谢你的想法。
这正是我所寻找的解释。我希望使用%qscan时要格外小心,以确保潜在的其他用户不会与奇怪的名称“混淆”,但我没有完全意识到%qscan实际引用的含义,以避免任何意外的解决方案。 – Alan
独特的临时变量的想法是一个很好的想法,但实际上我需要在循环之外的所有变量。至于做出一个独特的循环: %do i = 1%to%sysfunc(countw(&listvar,%str())); 我确实认为它好得多,但由于我可能与其他人共享这些宏,我更喜欢他们分解这些步骤,以免混淆人并使其更容易用于其他目的。 – Alan
我仍然有一个询问:如果我确实需要%qscan来避免不良分辨率,我仍然可以使用: %unquote(&& var&i .._ num) 我的猜测是否定的,因为不加引用会导致潜在的不需要解析度。我错了吗 ?如果不是,我将如何处理? (真相被告知这是一个混乱的情况,我只是试图完全理解宏的工作以及可用于防止意外结果的工具)。 不过,非常感谢您的第一个正确的答案 – Alan