[ RDocumentation ](/)

Moon  [ ](https://github.com/datacamp/rdocumentation-2.0) [ Learn R
](https://www.datacamp.com/learn/r)

Search all packages and functions

[ base  (version  3.6.2  ) ](/packages/base/versions/3.6.2)

#  Control: Control Flow

##  Description

These are the basic control-flow constructs of the  R  language. They function
in much the same way as control statements in any Algol-like language. They
are all [ reserved ](/link/reserved?package=base&version=3.6.2) words.

##  Usage

    
    
    if(cond) expr
    if(cond) cons.expr  else  alt.expr
    
    for(var in seq) expr
    while(cond) expr
    repeat expr
    break
    next

##  Arguments

cond

A length-one logical vector that is not ` NA ` . Conditions of length greater
than one are currently accepted with a warning, but only the first element is
used. An error is signalled instead when the environment variable `
_R_CHECK_LENGTH_1_CONDITION_ ` is set to true. Other types are coerced to
logical if possible, ignoring any class.

var

A syntactical name for a variable.

seq

An expression evaluating to a vector (including a list and an [ expression
](/link/expression?package=base&version=3.6.2) ) or to a [ pairlist
](/link/pairlist?package=base&version=3.6.2) or ` NULL ` . A factor value will
be coerced to a character vector.

expr, cons.expr, alt.expr

An _expression_ in a formal sense. This is either a simple expression or a so
called _compound expression_ , usually of the form ` { expr1 ; expr2 } ` .

##  Value

` if ` returns the value of the expression evaluated, or ` NULL ` invisibly if
none was (which may happen if there is no ` else ` ).

` for ` , ` while ` and ` repeat ` return ` NULL ` invisibly. ` for ` sets `
var ` to the last used element of ` seq ` , or to ` NULL ` if it was of length
zero.

` break ` and ` next ` do not return a value as they transfer control within
the loop.

##  Details

` break ` breaks out of a ` for ` , ` while ` or ` repeat ` loop; control is
transferred to the first statement outside the inner-most loop. ` next ` halts
the processing of the current iteration and advances the looping index. Both `
break ` and ` next ` apply only to the innermost of nested loops.

Note that it is a common mistake to forget to put braces ( ` { .. } ` ) around
your statements, e.g., after ` if(..) ` or ` for(....) ` . In particular, you
should not have a newline between ` } ` and ` else ` to avoid a syntax error
in entering a ` if ... else ` construct at the keyboard or via ` source ` .
For that reason, one (somewhat extreme) attitude of defensive programming is
to always use braces, e.g., for ` if ` clauses.

The ` seq ` in a ` for ` loop is evaluated at the start of the loop; changing
it subsequently does not affect the loop. If ` seq ` has length zero the body
of the loop is skipped. Otherwise the variable ` var ` is assigned in turn the
value of each element of ` seq ` . You can assign to ` var ` within the body
of the loop, but this will not affect the next iteration. When the loop
terminates, ` var ` remains as a variable containing its latest value.

##  References

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) _The New S Language_ .
Wadsworth & Brooks/Cole.

##  See Also

` [ Syntax ](/link/Syntax?package=base&version=3.6.2) ` for the basic  R
syntax and operators, ` [ Paren ](/link/Paren?package=base&version=3.6.2) `
for parentheses and braces.

` [ ifelse ](/link/ifelse?package=base&version=3.6.2) ` , ` [ switch
](/link/switch?package=base&version=3.6.2) ` for other ways to control flow.

##  Examples

[ Run this code
](https://app.datacamp.com/workspace/preview?_tag=rdocs&rdocsPath=packages%2Fbase%2Fversions%2F3.6.2%2Ftopics%2FControl&utm_source=r-docs&utm_medium=docs&utm_term=Control&utm_content=run_example_in_workspace)

    
    
    # NOT RUN {
    for(i in 1:5) print(1:i)
    for(n in c(2,5,10,20,50)) {
       x <- stats::rnorm(n)
       cat(n, ": ", sum(x^2), "\n", sep = "")
    }
    f <- factor(sample(lett