# 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.414214
 1.732051
 2
 2.236068
 2.449490
 2.645751
 2.828427
 3
 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)
 0
> while (b < 50) {
+     print(b)
+     temp <- a + b
+     a <- b
+     b <- temp
+ }
 1
 1
 2
 3
 5
 8
 13
 21
 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 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)
  0  1  1  2  3  5  8 13 21 34
> Fibonacci(3)
 0 1 1
> Fibonacci(2)
 0 1
> Fibonacci(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?