BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Notifications
Calcite | Level 5

What is the Proc IML equivalent of break/continue statments found in other languages, such as MATLAB and Python?

1 ACCEPTED SOLUTION

Accepted Solutions
Rick_SAS
SAS Super FREQ

Well, kinda. @dougc's code works if you are in a module but in open code it is invalid. The doc says "The GOTO statement must be inside a module or DO group. These statements must be able to resolve the referenced label within the current unit of statements."  What that means is that you can't jump out of a do loop unless the GOTO statement and label are both within some larger nested DO/END block that you submit, like this:

 

do;
   /* BREAK: exit loop immediately */
   count = 0;
   do i = 1 to 1000;
      roll = sample(die, 1);   /* roll die 1 time */
      if roll = 6 then goto BREAK;
      count = count + 1;
      /* other statements */
   end;
   BREAK:
   print count "rolls before rolling a 6"; 
end;

Personally, I do not recommend jumping outside of a loop. I think the DO UNTIL syntax is clearer and easier to read. 

View solution in original post

4 REPLIES 4
Rick_SAS
SAS Super FREQ

In the SAS DATA step, you can use the LEAVE and CONTINUE statements.

 

DO loops in SAS/IML do not support those statements. However, you can use a DO UNTIL loop to break out of a loop when a certain condition is met.  You can use a GOTO/LABEL statement to jump to the end of a loop and continue with the next iteration when a certain condition is met.  Here is an example of each construct:

 

/* simulate the roll of a six-sided die */
proc iml;
call randseed(54321);
die = 1:6;

/* BREAK: Exit loop when a condition is true */
done = 0;  /* set flag to FALSE */
do i = 1 to 1000 until(done);
   roll = sample(die, 1);   /* roll die 1 time */
   if roll = 6 then done = 1;
end;
print i " rolls until roll = " roll;


/* CONTINUE: Skip the body and go to the next iteration 
             when a condition is true */
count = 0;
do i = 1 to 1000;
   roll = sample(die, 1);   /* roll die 1 time */
   if roll = 6 then goto CONTINUE;
   count = count + 1;
CONTINUE:
end;
print count " rolls were not 6";
dougc
SAS Employee

You can also use a modification of Rick's CONTINUE example to break out of a loop immediately.  This would only be important if you had other code in the loop that you didn't want to execute

 

/* BREAK: exit loop immediately */
count = 0;
do i = 1 to 1000;
   roll = sample(die, 1);   /* roll die 1 time */
   if roll = 6 then goto BREAK;
   count = count + 1;
   /* other statements */
end;
BREAK:
print count "rolls before rolling a 6";

 

 

 

Rick_SAS
SAS Super FREQ

Well, kinda. @dougc's code works if you are in a module but in open code it is invalid. The doc says "The GOTO statement must be inside a module or DO group. These statements must be able to resolve the referenced label within the current unit of statements."  What that means is that you can't jump out of a do loop unless the GOTO statement and label are both within some larger nested DO/END block that you submit, like this:

 

do;
   /* BREAK: exit loop immediately */
   count = 0;
   do i = 1 to 1000;
      roll = sample(die, 1);   /* roll die 1 time */
      if roll = 6 then goto BREAK;
      count = count + 1;
      /* other statements */
   end;
   BREAK:
   print count "rolls before rolling a 6"; 
end;

Personally, I do not recommend jumping outside of a loop. I think the DO UNTIL syntax is clearer and easier to read. 

Notifications
Calcite | Level 5

That was the trick I was looking for. Nice!

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 4 replies
  • 3113 views
  • 0 likes
  • 3 in conversation