for(name in values) expr while(test) expr repeat expr break next
for construct in the language assigns
name successively to
each element in
values, then evaluates
expr once each time.
while construct evaluates
test. While
it is
TRUE (i.e., if the first element of the result coerced to
mode
logical is
TRUE), then
expr
is evaluated.
repeat construct evaluates
expr repeatedly. Because there is
no natural end to such a loop, it must be built into
expr, typically
through the use of an
if...else expression with
next and
break
commands.
The
next construct tells S-PLUS to terminate the current iteration
immediately and begin the next iteration.
The
break construct tells S-PLUS to terminate the current loop.
An
NA value for the test causes an error.
for loops in S-PLUS are often slow and
may use excessive amounts of memory. There are often faster alternative
to using
for loops, particularly involving
vectorization -- operating on whole vectors, matrices, etc. at a time
rather than in a loop.
If looping cannot be avoided, then it is generally faster to use
apply
,
lapply
,
sapply
, or
tapply
to do the looping than to use
for
.
Another alternative, useful when memory growth
with
for becomes excessive, is
For
.
See the S-PLUS Programmer's Manual, in particular the chapters on
"Using Less Time and Memory" and "Simulations in S-PLUS".
An error during one iteration of a loop may cause execution
to terminate, discarding unsaved results. You may save intermediate
results using
assign
(use
immediate=T),
or trap errors using
try
.
for(i in 1:10) print(i)
n <- 10
while(n > 0) {
cat("n is still greater than 0\n")
n <- n - 1
}
old.cummax <- function(x) {
# Pure S-PLUS version of cumulative maximum
if(length(x) > 1) {
for(i in 2:length(x))
x[i] <- max(x[i - 1], x[i])
}
x
}
bitstring <- function(n) {
string <- numeric(32)
i <- 0
while(n > 0) {
string[32 - i] <- n %% 2
n <- n %/% 2
i <- i + 1
}
firstone <- match(1, string)
string[firstone:32]
}
draw.aces <- function() {
draws <- 0
aces.drawn <- rep(F, 4)
repeat {
draw <- sample(1:52, 1, replace = T)
draws <- draws + 1
if(draw %% 13 != 1)
next
aces.drawn[draw %/% 13 + 1] <- T
if(all(aces.drawn))
break
}
cat("It took", draws, "draws to draw all four of the aces!\n")
}