R: Control Flow

Control {base} | R Documentation

## 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 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) or to a pairlist 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 }`.

### 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.

### 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.

### References

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

### See Also

`Syntax` for the basic R syntax and operators, `Paren` for parentheses and braces.

`ifelse`, `switch` for other ways to control flow.

### Examples

    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(letters[1:5], 10, replace = TRUE))
    for(i in unique(f)) print(i)

[Package base version 3.5.1 Index]