Skip to main content

Programming in R

You probably won't need this information for your assignments

On the preceding pages we have tried to introduce the basics of the R language - but have managed to avoid anything you might need to actually write your own program: things like if statements, loops, and writing functions.

Relevant help pages can be found with help("Control") and help("Function").

For loops

In R a while takes this form, where variable is the name of your iteration variable, and sequence is a vector or list of values:

for (variable in sequence) expression

The expression can be a single R command - or several lines of commands wrapped in curly brackets:

for (variable in sequence) { 
    expression
    expression
    expression
}

Here is a quick trivial example, printing the square root of the integers one to ten:

> for (x in c(1:10)) print(sqrt(x))
[1] 1
[1] 1.414214
[1] 1.732051
[1] 2
[1] 2.236068
[1] 2.449490
[1] 2.645751
[1] 2.828427
[1] 3
[1] 3.162278

While loops

In R a while takes this form, where condition evaluates to a boolean (True/False) and must be wrapped in ordinary brackets:

while (condition) expression

As with a for loop, expression can be a single R command - or several lines of commands wrapped in curly brackets:

while (condition) {
    expression
    expression
    expression
}

We'll start by using a "while loop" to print out the first few Fibonacci numbers: 0, 1, 1, 2, 3, 5, 8, 13, ... where each number is the sum of the previous two numbers. Create a new R script file, and copy this code into it:

a <- 0
b <- 1
print(a)
while (b < 50) {
    print(b)
    temp <- a + b
    a <- b
    b <- temp
}

If you go to the script's "Edit" menu and pick "Run all" you should get something like this in the R command console:

> a <- 0
> b <- 1
> print(a)
[1] 0
> while (b < 50) {
+     print(b)
+     temp <- a + b
+     a <- b
+     b <- temp
+ }
[1] 1
[1] 1
[1] 2
[1] 3
[1] 5
[1] 8
[1] 13
[1] 21
[1] 34

The code works fine, but both the output and the R commands are both shown in the R command window - its a bit messy.

This next version builds up the answer gradually using a vector, which it prints at the end:

x <- c(0,1)
while (length(x) < 10) {
    position <- length(x)
    new <- x[position] + x[position-1]
    x <- c(x,new)
}
print(x)

To understand how this manages to append the new value to the end of the vector x, try this at the command prompt:

> x <- c(1,2,3,4)
> c(x,5)
[1] 1 2 3 4 5

Writing Functions

This following script uses the function() command to create a function (based on the code above) which is then stored as an object with the name Fibonacci:

Fibonacci <- function(n) {
    x <- c(0,1)
    while (length(x) < n) {
        position <- length(x)
        new <- x[position] + x[position-1]
        x <- c(x,new)
    }
    return(x)
}

Once you run this code, there will be a new function available which we can now test:

> Fibonacci(10)
 [1]  0  1  1  2  3  5  8 13 21 34
> Fibonacci(3)
[1] 0 1 1
> Fibonacci(2)
[1] 0 1
> Fibonacci(1)
[1] 0 1

That seems to work nicely - except in the case n == 1 where the function is returning the first two Fibonacci numbers! This gives us an excuse to introduce the if statement.

The If statement

In order to fix our function we can do this:

Fibonacci <- function(n) {
    if (n==1) return(0)
    x <- c(0,1)
    while (length(x) < n) {
        position <- length(x)
        new <- x[position] + x[position-1]
        x <- c(x,new)
    }
    return(x)
}

In the above example we are using the simplest possible if statement:

if (condition) expression

The if statement can also be used like this:

if (condition) expression else expression

And, much like the while and for loops the expression can be multiline with curly brackets:

Fibonacci <- function(n) {
    if (n==1) {
        x <- 0
    } else {
        x <- c(0,1)
        while (length(x) < n) {
            position <- length(x)
            new <- x[position] + x[position-1]
            x <- c(x,new)
        }
    }
    return(x)
}

Do you like this version better that the previous one?