2015-07-01 167 views
1

作为我的一部分,循环需要完成直到满足条件。我使用的代码如下:SAS%do%直到循环

%IF &maxvif ge &thresh %THEN 

%DO %UNTIL (&maxvif lt &thresh) 

.... 

%END; 

但是,它不能正常运行。即使& maxvif = 4.05,它仍然说(& maxvif lt & thresh)是错误的。因此,这个循环从不停止。

下面是日志的一部分,两个宏变量都可以正确解析,但最终的评估出错了。

SYMBOLGEN:宏变量MAXVIF解析为4.050694277

SYMBOLGEN:宏变量THRESH解析为10

MLOGIC(BACKWARDVIF):%DO%UNTIL(& maxvif LT &脱粒)条件是 FALSE ;循环将再次迭代。

+2

我相信,如果你是在你需要使用%evalf或%sysevalf宏比较小数。 – Reeza

+0

谢谢,但它不起作用。实际上,在这个%if-%之前,还有另一个%,如果&maxvif lt&thresh%then%do。它正确地评估了这种情况。 –

+1

对不起@LuYang,但Reeza是正确的。它不仅可以工作,而且对于宏代码中涉及小数的操作也是必需的。 –

回答

2

您的病情正在评估为文字。在文本比较“10”<“4.05”自“1”<“4”之后,就像由于“​​A”<“B”引起的“AZ”<“BB”一样。

要充实@Reeza的评论,这里是一个示例宏,它似乎按预期工作。这一大堆的%sysevalf

%Macro testme(thresh,maxvif); 
    %Do %until (%sysevalf(&maxvif > &thresh)); 
     %Put "In Do Loop: maxvif= &maxvif -- thresh = &thresh"; 
     %Let maxvif = %sysevalf(&maxvif + 1); 
    %End; 
    %Put "--- DONE! maxvif= &maxvif -- thresh = &thresh"; 
%Mend; 

%testme(7,4.05123)打印到日志:

In Do Loop: maxvif= 4.05123 -- thresh = 7 
In Do Loop: maxvif= 5.05123 -- thresh = 7 
In Do Loop: maxvif= 6.05123 -- thresh = 7 
--- DONE! maxvif= 7.05123 -- thresh = 7; 
+0

谢谢蒂姆!它的工作原理。我尝试了另一种方法,使用%sysfunc(int(&maxvif)),它也可以。但是,我很困惑,因为它可以在%if-%then过程中正确评估,但不在%do-%之前。你有什么想法吗? –

+0

嗯。我无法重现,因此代码中可能会出现其他情况。当然,如果你输入3和4.05的值,它将作为文本或值的比较。 –

+0

您好,您可以在我的博客中找到代码:http://lyangquant.weebly.com/blog/stepvif_incomplete –