In this first lab we will (if necessary) briefly see how one can use R.

0. Getting R (and a GUI)

First to use R, you need to install it! You can download it from here. Since the original GUI for R is a bit limited, you may want to install more advanced GUI. One popular option is RStudio. Once you have installed everything appropriately we can start using R!

1. Basic instructions

I just list here some simple computations.

x <- 1
y <- 3
x + y
[1] 4
x - y
[1] -2
x * y
[1] 3
x / y
[1] 0.3333333
x^y
[1] 1
## and many other stuffs: log, exp, sin, cos, gamma, ...

2. Vector, matrices, array, list

x <- c(1, 5, -3, 7, 8, -15)## vector of reals
x
[1]   1   5  -3   7   8 -15
y <- c("toto", "tutu", "tata")## vector of character strings
y
[1] "toto" "tutu" "tata"
A <- matrix(x, 3)##a matrix with 3 rows (hence 2 columns) which is "filled columnwise" with x
A
     [,1] [,2]
[1,]    1    7
[2,]    5    8
[3,]   -3  -15
B <- matrix(x, 3, byrow = TRUE)## filled rowwise
B
     [,1] [,2]
[1,]    1    5
[2,]   -3    7
[3,]    8  -15
C <- matrix(y, 3, 4)## recycle the vector y to fill in the matrix
C
     [,1]   [,2]   [,3]   [,4]  
[1,] "toto" "toto" "toto" "toto"
[2,] "tutu" "tutu" "tutu" "tutu"
[3,] "tata" "tata" "tata" "tata"
## Tensors are also available from the array function
D <- array(1:60, dim = c(3, 4, 5))## A 3d tensor
E <- array(1:60, dim = c(5, 2, 3, 2))## A 4d tensor
D
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

, , 2

     [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24

, , 3

     [,1] [,2] [,3] [,4]
[1,]   25   28   31   34
[2,]   26   29   32   35
[3,]   27   30   33   36

, , 4

     [,1] [,2] [,3] [,4]
[1,]   37   40   43   46
[2,]   38   41   44   47
[3,]   39   42   45   48

, , 5

     [,1] [,2] [,3] [,4]
[1,]   49   52   55   58
[2,]   50   53   56   59
[3,]   51   54   57   60
l <- list(component1 = x, component2 = C)## list the most "powerfull type" can mix different object class within a list
l
$component1
[1]   1   5  -3   7   8 -15

$component2
     [,1]   [,2]   [,3]   [,4]  
[1,] "toto" "toto" "toto" "toto"
[2,] "tutu" "tutu" "tutu" "tutu"
[3,] "tata" "tata" "tata" "tata"
D <- cbind(x, y)## column binding to create a 2 column matrix (of which class???)
D
     x     y     
[1,] "1"   "toto"
[2,] "5"   "tutu"
[3,] "-3"  "tata"
[4,] "7"   "toto"
[5,] "8"   "tutu"
[6,] "-15" "tata"
D2 <- rbind(x, y)## row binding
D2
  [,1]   [,2]   [,3]   [,4]   [,5]   [,6]  
x "1"    "5"    "-3"   "7"    "8"    "-15" 
y "toto" "tutu" "tata" "toto" "tutu" "tata"

3. Linear algebra

x <- 1:3##integers from 1 to 3 (included)
y <- seq(2.1, 15, length = 3)##evenly space points between 2.1 ane 15 (total length 3)

x + y
[1]  3.10 10.55 18.00
x * y ## componentwise multiplication
[1]  2.1 17.1 45.0
x %*% y ## inner product
     [,1]
[1,] 64.2
A <- diag(5, 3)## 3 x 3 diagonal matrix with 5 on the diagonal
B <- matrix(1:9, 3)
t(B) ## Matrix transpose
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
A %*%  ## matrix multiplication
A * A ## componentwise multiplication (Hadamard product)
     [,1] [,2] [,3]
[1,]  125    0    0
[2,]    0  125    0
[3,]    0    0  125
solve(A)## matrix inverse
     [,1] [,2] [,3]
[1,]  0.2  0.0  0.0
[2,]  0.0  0.2  0.0
[3,]  0.0  0.0  0.2
eigen(A)## eigen decomposition
eigen() decomposition
$values
[1] 5 5 5

$vectors
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    0    1    0
[3,]    1    0    0
svd(A)## singular value decomposition
$d
[1] 5 5 5

$u
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

$v
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

4. Random number generation

rnorm(5, 0, 4)##5 independent draws from a gaussian distribution with mean 0 and *standard deviation* 4.
[1]  2.0176446  1.3996484 -2.3870872  0.1009725  3.8961008
runif(5, -4, 3)## 5 independent draws from a U(-4, 3) distribution
[1] -1.5098755  2.2585768 -1.0820546 -2.7980153  0.8389459

5. Basic plots

## Generate a random walk
randomwalk <- cumsum(rnorm(1000))
plot(randomwalk)

plot(randomwalk, type = "l")

plot(randomwalk, type = "o")


x <- seq(0, pi, length = 5)
y <- sin(x)
plot(x, y, xlab = "x", ylab = "sin(x)")


plot(sin, from = 0, to = 2 * pi, col = "orange", lwd = 2)##lwd for Line WiDth


x <- rnorm(100)
hist(x, freq = FALSE)##freq = FALSE so that area = 1
plot(dnorm, from = -4, to = 4, col = "green", lwd = 2, lty = 2, add = TRUE)## add = TRUE to add the plot to the current graphic


x <- rnorm(100)
y <- rnorm(100, 1)
boxplot(cbind(x, y))##boxplots

6. Importing / Exporting data

Well read the documentation of the read.table, write.table and save function.

7. For, if, else, loops

for (i in 1:3)
  print(i)
[1] 1
[1] 2
[1] 3
astring <- "what"

if (astring == "who"){
  outstring <- "what is"
  a <- 1
} else if (astring == "which"){
  outstring <- "what?"
  a <- 2
} else {
  outstring <- "is what?"
  a <- 3
}

print(outstring)
[1] "is what?"

8. Creating function

myfunction <- function(arg1, arg2, optional.argument = "take log"){
  output <- arg1 + arg2
  
  if (optional.argument == "take log")
    output <- log(output)
  
  return(output)
}

myfunction(2, 3)
[1] 1.609438
myfunction(2, 3, "do not take log")
[1] 5

Watch out an R function can only return a single object so if you want to ouput several quantities you will have to store them within a list, i.e., as below

myfunction2 <- function(arg1, arg2, optional.argument = "take log"){
  output <- arg1 + arg2
  
  if (optional.argument == "take log")
    output <- log(output)
  
  return(list(output = output, message = optional.argument))
}

myfunction2(2, 3)
$output
[1] 1.609438

$message
[1] "take log"

9. Numerical optimization

rosenbrock <- function(x) {   ## Rosenbrock Banana function
    x1 <- x[1]
    x2 <- x[2]
    100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}

n.grid <- 100
x <- seq(-2, 2, length = n.grid)
y <- seq(-3, 3, length = n.grid)
grid <- expand.grid(x, y)
z <- apply(grid, 1, rosenbrock)##compute the function on the grid
z <- matrix(z, n.grid)

## plot of it (just take care of the persp line of code not the previous ones)
jet.colors <- colorRampPalette( c("blue", "green") )
nbcol <- 250
color <- jet.colors(nbcol)
# Compute the z-value at the facet centres
zfacet <- z[-1, -1] + z[-1, -n.grid] + z[-n.grid, -1] + z[-n.grid, -n.grid]
# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)
persp(x, y, z, col = color[facetcol], phi = 40, theta = -30, border = NA)


## minimize the banana function
init <- c(0, 0)## minimum is at (1, 1)
optim(init, rosenbrock)
$par
[1] 0.9999564 0.9999085

$value
[1] 3.729052e-09

$counts
function gradient 
     169       NA 

$convergence
[1] 0

$message
NULL
optim(init, rosenbrock, method = "BFGS")## changing optimizer
$par
[1] 0.9998000 0.9996001

$value
[1] 3.998081e-08

$counts
function gradient 
      63       26 

$convergence
[1] 0

$message
NULL
nlm(rosenbrock, init)## another (the one I used often) optimizer
$minimum
[1] 4.023727e-12

$estimate
[1] 0.999998 0.999996

$gradient
[1] -7.328280e-07  3.605689e-07

$code
[1] 1

$iterations
[1] 26
LS0tCnRpdGxlOiAiQSAodG9vKSBzaG9ydCBpbnRyb2R1Y3Rpb24gdG8gUiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSW4gdGhpcyBmaXJzdCBsYWIgd2Ugd2lsbCAoaWYgbmVjZXNzYXJ5KSBicmllZmx5IHNlZSBob3cgb25lIGNhbiB1c2UgKlIqLgoKIyMgMC4gR2V0dGluZyBSIChhbmQgYSBHVUkpCgpGaXJzdCB0byB1c2UgKlIqLCB5b3UgbmVlZCB0byBpbnN0YWxsIGl0ISBZb3UgY2FuIGRvd25sb2FkIGl0IGZyb20gW2hlcmVdKHd3dy5yLXByb2plY3Qub3JnKS4gU2luY2UgdGhlIG9yaWdpbmFsIEdVSSBmb3IgUiBpcyBhIGJpdCBsaW1pdGVkLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBtb3JlIGFkdmFuY2VkIEdVSS4gT25lIHBvcHVsYXIgb3B0aW9uIGlzIFtSU3R1ZGlvXShodHRwczovL3JzdHVkaW8uY29tKS4gT25jZSB5b3UgaGF2ZSBpbnN0YWxsZWQgZXZlcnl0aGluZyBhcHByb3ByaWF0ZWx5IHdlIGNhbiBzdGFydCB1c2luZyAqUiohCgojIyAxLiBCYXNpYyBpbnN0cnVjdGlvbnMKCkkganVzdCBsaXN0IGhlcmUgc29tZSBzaW1wbGUgY29tcHV0YXRpb25zLgoKCmBgYHtyfQp4IDwtIDEKeSA8LSAzCnggKyB5CnggLSB5CnggKiB5CnggLyB5CnheeQojIyBhbmQgbWFueSBvdGhlciBzdHVmZnM6IGxvZywgZXhwLCBzaW4sIGNvcywgZ2FtbWEsIC4uLgpgYGAKCgojIyAyLiBWZWN0b3IsIG1hdHJpY2VzLCBhcnJheSwgbGlzdAoKYGBge3J9CnggPC0gYygxLCA1LCAtMywgNywgOCwgLTE1KSMjIHZlY3RvciBvZiByZWFscwp4CnkgPC0gYygidG90byIsICJ0dXR1IiwgInRhdGEiKSMjIHZlY3RvciBvZiBjaGFyYWN0ZXIgc3RyaW5ncwp5CgpBIDwtIG1hdHJpeCh4LCAzKSMjYSBtYXRyaXggd2l0aCAzIHJvd3MgKGhlbmNlIDIgY29sdW1ucykgd2hpY2ggaXMgImZpbGxlZCBjb2x1bW53aXNlIiB3aXRoIHgKQQpCIDwtIG1hdHJpeCh4LCAzLCBieXJvdyA9IFRSVUUpIyMgZmlsbGVkIHJvd3dpc2UKQgpDIDwtIG1hdHJpeCh5LCAzLCA0KSMjIHJlY3ljbGUgdGhlIHZlY3RvciB5IHRvIGZpbGwgaW4gdGhlIG1hdHJpeApDCgojIyBUZW5zb3JzIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIHRoZSBhcnJheSBmdW5jdGlvbgpEIDwtIGFycmF5KDE6NjAsIGRpbSA9IGMoMywgNCwgNSkpIyMgQSAzZCB0ZW5zb3IKRSA8LSBhcnJheSgxOjYwLCBkaW0gPSBjKDUsIDIsIDMsIDIpKSMjIEEgNGQgdGVuc29yCkQKCmwgPC0gbGlzdChjb21wb25lbnQxID0geCwgY29tcG9uZW50MiA9IEMpIyMgbGlzdCB0aGUgbW9zdCAicG93ZXJmdWxsIHR5cGUiIGNhbiBtaXggZGlmZmVyZW50IG9iamVjdCBjbGFzcyB3aXRoaW4gYSBsaXN0CmwKCkQgPC0gY2JpbmQoeCwgeSkjIyBjb2x1bW4gYmluZGluZyB0byBjcmVhdGUgYSAyIGNvbHVtbiBtYXRyaXggKG9mIHdoaWNoIGNsYXNzPz8/KQpECkQyIDwtIHJiaW5kKHgsIHkpIyMgcm93IGJpbmRpbmcKRDIKYGBgCgojIyAzLiBMaW5lYXIgYWxnZWJyYQoKYGBge3J9CnggPC0gMTozIyNpbnRlZ2VycyBmcm9tIDEgdG8gMyAoaW5jbHVkZWQpCnkgPC0gc2VxKDIuMSwgMTUsIGxlbmd0aCA9IDMpIyNldmVubHkgc3BhY2UgcG9pbnRzIGJldHdlZW4gMi4xIGFuZSAxNSAodG90YWwgbGVuZ3RoIDMpCgp4ICsgeQp4ICogeSAjIyBjb21wb25lbnR3aXNlIG11bHRpcGxpY2F0aW9uCnggJSolIHkgIyMgaW5uZXIgcHJvZHVjdAoKQSA8LSBkaWFnKDUsIDMpIyMgMyB4IDMgZGlhZ29uYWwgbWF0cml4IHdpdGggNSBvbiB0aGUgZGlhZ29uYWwKQiA8LSBtYXRyaXgoMTo5LCAzKQp0KEIpICMjIE1hdHJpeCB0cmFuc3Bvc2UKQSAlKiUgICMjIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgpBICogQSAjIyBjb21wb25lbnR3aXNlIG11bHRpcGxpY2F0aW9uIChIYWRhbWFyZCBwcm9kdWN0KQpzb2x2ZShBKSMjIG1hdHJpeCBpbnZlcnNlCmVpZ2VuKEEpIyMgZWlnZW4gZGVjb21wb3NpdGlvbgpzdmQoQSkjIyBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uCmBgYAoKIyMgNC4gUmFuZG9tIG51bWJlciBnZW5lcmF0aW9uCgpgYGB7cn0Kcm5vcm0oNSwgMCwgNCkjIzUgaW5kZXBlbmRlbnQgZHJhd3MgZnJvbSBhIGdhdXNzaWFuIGRpc3RyaWJ1dGlvbiB3aXRoIG1lYW4gMCBhbmQgKnN0YW5kYXJkIGRldmlhdGlvbiogNC4KcnVuaWYoNSwgLTQsIDMpIyMgNSBpbmRlcGVuZGVudCBkcmF3cyBmcm9tIGEgVSgtNCwgMykgZGlzdHJpYnV0aW9uCmBgYAoKIyMgNS4gQmFzaWMgcGxvdHMKCmBgYHtyfQojIyBHZW5lcmF0ZSBhIHJhbmRvbSB3YWxrCnJhbmRvbXdhbGsgPC0gY3Vtc3VtKHJub3JtKDEwMDApKQpwbG90KHJhbmRvbXdhbGspCnBsb3QocmFuZG9td2FsaywgdHlwZSA9ICJsIikKcGxvdChyYW5kb213YWxrLCB0eXBlID0gIm8iKQoKeCA8LSBzZXEoMCwgcGksIGxlbmd0aCA9IDUpCnkgPC0gc2luKHgpCnBsb3QoeCwgeSwgeGxhYiA9ICJ4IiwgeWxhYiA9ICJzaW4oeCkiKQoKcGxvdChzaW4sIGZyb20gPSAwLCB0byA9IDIgKiBwaSwgY29sID0gIm9yYW5nZSIsIGx3ZCA9IDIpIyNsd2QgZm9yIExpbmUgV2lEdGgKCnggPC0gcm5vcm0oMTAwKQpoaXN0KHgsIGZyZXEgPSBGQUxTRSkjI2ZyZXEgPSBGQUxTRSBzbyB0aGF0IGFyZWEgPSAxCnBsb3QoZG5vcm0sIGZyb20gPSAtNCwgdG8gPSA0LCBjb2wgPSAiZ3JlZW4iLCBsd2QgPSAyLCBsdHkgPSAyLCBhZGQgPSBUUlVFKSMjIGFkZCA9IFRSVUUgdG8gYWRkIHRoZSBwbG90IHRvIHRoZSBjdXJyZW50IGdyYXBoaWMKCnggPC0gcm5vcm0oMTAwKQp5IDwtIHJub3JtKDEwMCwgMSkKYm94cGxvdChjYmluZCh4LCB5KSkjI2JveHBsb3RzCmBgYAoKIyMgNi4gSW1wb3J0aW5nIC8gRXhwb3J0aW5nIGRhdGEKCldlbGwgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgKnJlYWQudGFibGUqLCAqd3JpdGUudGFibGUqIGFuZCAqc2F2ZSogZnVuY3Rpb24uIAoKIyMgNy4gRm9yLCBpZiwgZWxzZSwgbG9vcHMKCmBgYHtyfQpmb3IgKGkgaW4gMTozKQogIHByaW50KGkpCgphc3RyaW5nIDwtICJ3aGF0IgoKaWYgKGFzdHJpbmcgPT0gIndobyIpewogIG91dHN0cmluZyA8LSAid2hhdCBpcyIKICBhIDwtIDEKfSBlbHNlIGlmIChhc3RyaW5nID09ICJ3aGljaCIpewogIG91dHN0cmluZyA8LSAid2hhdD8iCiAgYSA8LSAyCn0gZWxzZSB7CiAgb3V0c3RyaW5nIDwtICJpcyB3aGF0PyIKICBhIDwtIDMKfQoKcHJpbnQob3V0c3RyaW5nKQpgYGAKCiMjIDguIENyZWF0aW5nIGZ1bmN0aW9uCgpgYGB7cn0KbXlmdW5jdGlvbiA8LSBmdW5jdGlvbihhcmcxLCBhcmcyLCBvcHRpb25hbC5hcmd1bWVudCA9ICJ0YWtlIGxvZyIpewogIG91dHB1dCA8LSBhcmcxICsgYXJnMgogIAogIGlmIChvcHRpb25hbC5hcmd1bWVudCA9PSAidGFrZSBsb2ciKQogICAgb3V0cHV0IDwtIGxvZyhvdXRwdXQpCiAgCiAgcmV0dXJuKG91dHB1dCkKfQoKbXlmdW5jdGlvbigyLCAzKQpteWZ1bmN0aW9uKDIsIDMsICJkbyBub3QgdGFrZSBsb2ciKQpgYGAKCldhdGNoIG91dCBhbiAqUiogZnVuY3Rpb24gY2FuIG9ubHkgcmV0dXJuIGEgc2luZ2xlIG9iamVjdCBzbyBpZiB5b3Ugd2FudCB0byBvdXB1dCBzZXZlcmFsIHF1YW50aXRpZXMgeW91IHdpbGwgaGF2ZSB0byBzdG9yZSB0aGVtIHdpdGhpbiBhIGxpc3QsIGkuZS4sIGFzIGJlbG93CmBgYHtyfQpteWZ1bmN0aW9uMiA8LSBmdW5jdGlvbihhcmcxLCBhcmcyLCBvcHRpb25hbC5hcmd1bWVudCA9ICJ0YWtlIGxvZyIpewogIG91dHB1dCA8LSBhcmcxICsgYXJnMgogIAogIGlmIChvcHRpb25hbC5hcmd1bWVudCA9PSAidGFrZSBsb2ciKQogICAgb3V0cHV0IDwtIGxvZyhvdXRwdXQpCiAgCiAgcmV0dXJuKGxpc3Qob3V0cHV0ID0gb3V0cHV0LCBtZXNzYWdlID0gb3B0aW9uYWwuYXJndW1lbnQpKQp9CgpteWZ1bmN0aW9uMigyLCAzKQpgYGAKCiMjIDkuIE51bWVyaWNhbCBvcHRpbWl6YXRpb24KCmBgYHtyfQpyb3NlbmJyb2NrIDwtIGZ1bmN0aW9uKHgpIHsgICAjIyBSb3NlbmJyb2NrIEJhbmFuYSBmdW5jdGlvbgogICAgeDEgPC0geFsxXQogICAgeDIgPC0geFsyXQogICAgMTAwICogKHgyIC0geDEgKiB4MSleMiArICgxIC0geDEpXjIKfQoKbi5ncmlkIDwtIDEwMAp4IDwtIHNlcSgtMiwgMiwgbGVuZ3RoID0gbi5ncmlkKQp5IDwtIHNlcSgtMywgMywgbGVuZ3RoID0gbi5ncmlkKQpncmlkIDwtIGV4cGFuZC5ncmlkKHgsIHkpCnogPC0gYXBwbHkoZ3JpZCwgMSwgcm9zZW5icm9jaykjI2NvbXB1dGUgdGhlIGZ1bmN0aW9uIG9uIHRoZSBncmlkCnogPC0gbWF0cml4KHosIG4uZ3JpZCkKCiMjIHBsb3Qgb2YgaXQgKGp1c3QgdGFrZSBjYXJlIG9mIHRoZSBwZXJzcCBsaW5lIG9mIGNvZGUgbm90IHRoZSBwcmV2aW91cyBvbmVzKQpqZXQuY29sb3JzIDwtIGNvbG9yUmFtcFBhbGV0dGUoIGMoImJsdWUiLCAiZ3JlZW4iKSApCm5iY29sIDwtIDI1MApjb2xvciA8LSBqZXQuY29sb3JzKG5iY29sKQojIENvbXB1dGUgdGhlIHotdmFsdWUgYXQgdGhlIGZhY2V0IGNlbnRyZXMKemZhY2V0IDwtIHpbLTEsIC0xXSArIHpbLTEsIC1uLmdyaWRdICsgelstbi5ncmlkLCAtMV0gKyB6Wy1uLmdyaWQsIC1uLmdyaWRdCiMgUmVjb2RlIGZhY2V0IHotdmFsdWVzIGludG8gY29sb3IgaW5kaWNlcwpmYWNldGNvbCA8LSBjdXQoemZhY2V0LCBuYmNvbCkKcGVyc3AoeCwgeSwgeiwgY29sID0gY29sb3JbZmFjZXRjb2xdLCBwaGkgPSA0MCwgdGhldGEgPSAtMzAsIGJvcmRlciA9IE5BKQoKIyMgbWluaW1pemUgdGhlIGJhbmFuYSBmdW5jdGlvbgppbml0IDwtIGMoMCwgMCkjIyBtaW5pbXVtIGlzIGF0ICgxLCAxKQpvcHRpbShpbml0LCByb3NlbmJyb2NrKQpvcHRpbShpbml0LCByb3NlbmJyb2NrLCBtZXRob2QgPSAiQkZHUyIpIyMgY2hhbmdpbmcgb3B0aW1pemVyCm5sbShyb3NlbmJyb2NrLCBpbml0KSMjIGFub3RoZXIgKHRoZSBvbmUgSSBvZnRlbiB1c2VkKSBvcHRpbWl6ZXIKYGBgCgoKCg==