Sas 迭代时限制%do%
我想在宏函数中运行while/until循环,并限制其最大迭代次数。我在“普通”sas中找到了如何执行此操作: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);
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%。