【问题标题】:SAS %do %until loopSAS %do %直到循环
【发布时间】:2015-07-01 04:06:00
【问题描述】:

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

%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 &thresh) 条件是 错误的;循环将再次迭代。

【问题讨论】:

  • 我相信如果您在宏中比较十进制数,您需要使用 %evalf 或 %sysevalf。
  • 谢谢,但它不起作用。实际上,在这个 %if-%then 之前,还有一个 %if &maxvif lt &thresh %then %do。它正确地评估了条件。
  • 对不起@LuYang,但 Reeza 是正确的。它不仅有效,而且宏代码中涉及小数的操作也需要它。

标签: loops macros sas


【解决方案1】:

您的病情正在被评估为文本。在文本比较中,“10”

为了充实@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;

【讨论】:

  • 谢谢蒂姆!它有效。我尝试了另一种方法,即使用 %sysfunc(int(&maxvif)),它也有效。但是,我很困惑,因为它可以在 %if-%then 过程中正确评估,但不能在 %do-%until 中进行评估。你有什么想法吗?
  • 嗯。我无法重现这一点,因此您的代码中可能还有其他内容。当然,如果您输入 3 和 4.05 的值,它将用作文本或值比较。
  • 嗨,蒂姆,您可以在我的博客中找到代码:lyangquant.weebly.com/blog/stepvif_incomplete
猜你喜欢
  • 2018-10-03
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多