Sas 迭代时限制%do%

Sas 迭代时限制%do%,sas,sas-macro,Sas,Sas Macro,我想在宏函数中运行while/until循环,并限制其最大迭代次数。我在“普通”sas中找到了如何执行此操作: data dataset; do i=1 to 10 until(condition); /*10 iterations max */ /* stuff */ end; run; 但如果我在宏函数中尝试: %macro mf; data dataset; %do i=1 %to 10 %until(nrow(X)>10);

我想在宏函数中运行while/until循环,并限制其最大迭代次数。我在“普通”sas中找到了如何执行此操作:

 data dataset;
    do i=1 to 10 until(condition);      /*10 iterations max */
        /* stuff */
    end;
 run;
但如果我在宏函数中尝试:

 %macro mf;
 data dataset;
 %do i=1 %to 10 %until(nrow(X)>10);      /*10 iterations max */
 /* stuff */
 %end;
 run;
 %mend;

%mf;
我发现以下错误:

ERROR: Improper use of macro reserved word until.
ERROR: A dummy macro will be compiled.
ERROR: Required operator not found in expression: 10 %until(nrow(X)>10)
ERROR: The %TO value of the %DO I loop is invalid.
ERROR: The macro MF will stop executing.
在宏函数中限制循环迭代的正确方法是什么

以下是一个数据集,以备您测试想法时使用:

DATA dataset;
input X Y Z;
cards;
10 0 20
50 20 60
90 60 30
run;

以下是您可以使用的示例:

%macro mf;
  %let i=0;
  %do %until(&onechar=e or &i=10);
    %let i=%eval(&i+1);
    %let onechar=%substr(abcdefghij,&i,1);
  %end;
  %put onechar=&onechar;
  %put i=&i;
%mend mf;
%mf;

如果宏循环发现“e”或i=10,则宏循环停止

为什么要在数据步骤中使用宏
%DO%
循环,而它的设计目的是实现相同的结果?无论如何都要将数据步骤包装在宏中以使其可重用,但在本例中,常规的
do while
循环就足够了。谷歌搜索术语“sas macro do-until”得到了
%do%until
的参考页作为第一个结果:它甚至包含示例代码。这大大减少了你需要输入的单词,你收到答案的速度也会更快。我喜欢帮助陷入困境的人,但请确保在请求他人帮助之前,你已经做了自己的研究。@ChrisJ:这段代码是从我看到的一些帽子中得到的灵感。我只是用它作为例子,没有在我自己的文章中使用datastep,这太复杂了,无法发布在这里。@RobertPenridge:我在发布之前确实搜索了很多,但是被
的组合误导了,直到上面发布了
(我试图将其推广到宏sas,但没有成功)。此外,我使用了关键字
while
而不是
till
%do%的sas文档,而
没有显示如何解决我的问题。假设
while
until
相似,我想我会为他们找到相同的建议,所以直到
文档我才检查
%do%。