Loops SAS%do%直到循环

Loops SAS%do%直到循环,loops,macros,sas,Loops,Macros,Sas,作为my的一部分,需要执行循环,直到满足条件。我使用的代码如下: %IF &maxvif ge &thresh %THEN %DO %UNTIL (&maxvif lt &thresh) .... %END; 但是,它无法正常运行。即使&maxvif=4.05,它仍然表示(&maxvif lt&thresh)是错误的。因此,这个循环从未停止过 下面是日志的一部分,两个宏变量都已正确解析,但最终计算出错 SYMBOLGEN:宏变量MAXVIF解析为4.050

作为my的一部分,需要执行循环,直到满足条件。我使用的代码如下:

%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%直到(&maxvif lt&thresh)条件满足 虚假的;循环将再次迭代


您的情况正在评估为文本。在文本比较中,“10”从“1”到“4.05”,就像“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;

我认为,如果要在宏中比较十进制数,需要使用%evalf或%sysevalf。谢谢,但这不起作用。实际上,在这个%if-%then之前,还有另一个%if&maxvif lt&thresh%then%do。它正确地评估了条件。抱歉@LuYang,但Reeza是正确的。它不仅可以工作,而且对于宏代码中涉及小数的操作也是必需的。谢谢Tim!它可以工作。我尝试了另一种方法,使用%sysfunc(int(&maxvif)),它也可以工作。但是,我感到困惑,因为它可以在%if-%then过程中正确计算,但不能在%do-%until中正确计算。你知道吗?嗯,我无法复制,所以你的代码中可能还有其他东西。当然,如果您输入值3和4.05,它将用作文本或值比较。嗨,蒂姆,您可以在我的博客中找到代码: