2015-07-01 168 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 –