1. Introduction
This is the first tutorial of the workshop. This is for you to familiarise yourself with R, R Studio and the console.
2. Installing R and R Studio
You can go directly to 3 if you’ve installed R and R Studio
We will be using R Studio, but R studio can only work if R is already installed, so we need to have both installed.
2.1. Installing R
R is free and can be installed in Windows, Mac, Linux. Go to the R project website. Once there click on Download R and select a CRAN Mirror (you can choose any)
Now, follow the instructions and you will have R installed in your own computer.
2.2. Installing R Studio
Go to the R Studio website, choose the free version and download the file according to your operating system.
Once you have installed both R and R Studio, you don’t need to interact at all with R. You can do everything you need from within R Studio.
Note: R Studio can do everything that R can, but R cannot do everything that R Studio does
3.Getting started with R Studio
3.1. Working directory
Set the working directory. In a real-life situation, this is where you saved your data.
setwd("copy/the/Path/to/your/folder/here")
If you are unsure where your current working directory is, you can use the function getwd(), which literally means: “get working directory”. The working directory will be printed on your console.
getwd()
3.2. Open a new script
Go to the top left corner, underneath the “File” menu, and click on the icon with a plus sign. That will open a new script for you to type your commands.
3.3. Installing packages
Installing packages can be done by coding or clicking on the “Tools” tab of the R Studio bar. You only need to install packages once (unless you change computer or there is an update).
The code for installing packages is as follows:
#one time instalation
install.packages('tidyverse')
install.packages('haven')
install.packages("foreign")
# You can also install more than one package at a time, adding a letter "c" for concatenate before the names of the packages
install.packages(c("tidyverse", "haven"))
3.4. Loading packages
Installing packages is the first step, but we still need to add another step to actually be able to use them. Unfortunately, this has to be done each time you start a new session in R or R Studio.
Every time that you start a new data analysis project, it is a good practice to start your script with loading the packages that you want to use. You don’t need to add them all at once, but it makes for tidier and more efficient coding if you do so.
When installing, packages are downloaded to a library (a folder in your computer), so when we want to load packages to R, we use the function library.
# Loading packages (load the packages in every session!)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 3.6.1
## -- Attaching packages --------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.1 v purrr 0.3.2
## v tibble 2.1.3 v dplyr 0.8.2
## v tidyr 0.8.3 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## Warning: package 'ggplot2' was built under R version 3.6.1
## -- Conflicts ------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(haven)
## Warning: package 'haven' was built under R version 3.6.1
library(foreign)
## Warning: package 'foreign' was built under R version 3.6.1
3.5. Data types and structures
Creating variables (vectors) of length 1, using the assign arrow
a <- 3
b <- 5
c <- 9
We can perform basic operations with variables
b*c
## [1] 45
We can assign the result to a new variable called ‘d’
d <- b*c/a
and then, see the value of the variable “d”
d
## [1] 15
4. Loading/Importing data into R
The function we use to import data into R will depend on the format in which the data is. Data in .dat, .txt or .csv formats can be read using base R functions (don’t need to use any package), but data in Stata, SPSS or SAS format, to name a few, need a special package.
The package haven can be used to easily import Stata and SPSS data files.
Each of these packages has a specific function to read a specific dataset. You can check the package documentation (linked above) or a simple Google search to get your answer.
The following example is to read in a .dat file from: Wright, D. and London, K. (2011). Modern Regression Techniques Using R, London: Sage. (Chapter 8). We use the base package function read.delim, as such
mydata <- read.delim("26934_exercise.dat")
You can also read online data directly if you specify the link, as such:
(This is from Wright and London’s book website companion. It’s the same data as before. You can use any of the two codes)
mydata<-read.delim("https://us.sagepub.com/sites/default/files/upm-binaries/26934_exercise.dat")
5. Explore the data
If you want to browse the data to see what it contains, you can simply click on the “Environment” tab and then click on the corresponding object. Alternatively, you can use the following code:
View(mydata)
Or you can print the first six rows of data by typing:
head(mydata)
## wcond class w1sn02 w2sn02 w1int w2int w1att w2att z1pbc z2pbc sqw1
## 1 1 1 7 7 7.0 7.0 7.0 7.0 7.00 7.00 2.5495098
## 2 1 1 5 3 5.5 3.5 6.0 4.0 4.75 4.25 2.3452079
## 3 1 1 2 2 2.5 1.5 4.5 3.5 1.75 2.50 0.7071068
## 4 1 1 4 2 3.5 1.5 4.0 2.5 4.25 2.75 0.7071068
## 5 1 1 2 2 3.0 1.5 4.5 3.0 5.25 3.50 1.2247449
## 6 1 1 2 4 6.0 3.0 5.5 4.5 3.75 2.75 1.8708287
## sqw2
## 1 2.5495098
## 2 2.3452079
## 3 0.7071068
## 4 0.7071068
## 5 0.7071068
## 6 2.1213203
To obtain descriptive statistics, you can type:
mean(mydata$sqw2, na.rm=T) # na.rm=T is used to remove missing values
## [1] 1.78919
sd(mydata$sqw2, na.rm=T) # that will give you the standard deviation
## [1] 0.5633153
A much faster way of obtaining more detailed information about a variable is to use the summary function:
summary(mydata$sqw2)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.7071 1.5811 1.8708 1.7892 2.1213 3.2404
In the next practical, you will get to use more functions. This is just the first taster.
Bonus track
If this is the first time you’ve been coding, then you need to be “initiated”. Type the following on your R script:
myfirstprogramme<-function() {
print("Hello World!")
}
And then type:
myfirstprogramme()
## [1] "Hello World!"
Welcome to world of coding!
LS0tDQp0aXRsZTogIkdldHRpbmcgc3RhcnRlZCB3aXRoIFIgPGltZyBzcmM9XCJzZW1pbmFyc19sb2dvLnBuZ1wiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiNTBcIiBzdHlsZT1cImZsb2F0OiByaWdodDtcIi8+Ig0KYXV0aG9yOiAiUGF0cmljaW8gVHJvbmNvc28gKHdpdGggdGhhbmtzIHRvIEFuYSBNb3JhbGVzLUdvbWV6KSINCmRhdGU6ICJMYXRlc3QgdXBkYXRlOiBGZWJydWFyeSAyMDIwIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBmb250c2l6ZTogMTJwdA0KICAgIGhpZ2hsaWdodGVyOiBudWxsDQogICAgdGhlbWU6ICJjb3NtbyINCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgdG9jX2RlcHRoOiAzDQogICAgaW5jbHVkZXM6DQogICAgICAjaW5faGVhZGVyOiBoZWFkZXIuaHRtbA0KICAgICAgYWZ0ZXJfYm9keTogZm9vdGVyLmh0bWwNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIDEuIEludHJvZHVjdGlvbg0KDQpUaGlzIGlzIHRoZSBmaXJzdCB0dXRvcmlhbCBvZiB0aGUgd29ya3Nob3AuIFRoaXMgaXMgZm9yIHlvdSB0byBmYW1pbGlhcmlzZSB5b3Vyc2VsZiB3aXRoIFIsIFIgU3R1ZGlvIGFuZCB0aGUgY29uc29sZS4NCjxicj4NCg0KKioqDQojIDIuIEluc3RhbGxpbmcgUiBhbmQgUiBTdHVkaW8NCg0KKipZb3UgY2FuIGdvIGRpcmVjdGx5IHRvIDMgaWYgeW91J3ZlIGluc3RhbGxlZCBSIGFuZCBSIFN0dWRpbyoqDQoNCldlIHdpbGwgYmUgdXNpbmcgUiBTdHVkaW8sIGJ1dCBSIHN0dWRpbyBjYW4gb25seSB3b3JrIGlmIFIgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHNvIHdlIG5lZWQgdG8gaGF2ZSBib3RoIGluc3RhbGxlZC4NCjxicj4NCg0KKioqDQojIyAyLjEuIEluc3RhbGxpbmcgUg0KDQpSIGlzIGZyZWUgYW5kIGNhbiBiZSBpbnN0YWxsZWQgaW4gV2luZG93cywgTWFjLCBMaW51eC4gR28gdG8gdGhlIFtSIHByb2plY3Qgd2Vic2l0ZV0oaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZy8pLiBPbmNlIHRoZXJlIGNsaWNrIG9uICoqRG93bmxvYWQgUioqIGFuZCBzZWxlY3QgYSBDUkFOIE1pcnJvciAoeW91IGNhbiBjaG9vc2UgYW55KQ0KDQpOb3csIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCB5b3Ugd2lsbCBoYXZlIFIgaW5zdGFsbGVkIGluIHlvdXIgb3duIGNvbXB1dGVyLiAgDQo8YnI+DQoNCioqKg0KIyMgMi4yLiAgSW5zdGFsbGluZyBSIFN0dWRpbw0KDQpHbyB0byB0aGUgW1IgU3R1ZGlvIHdlYnNpdGVdKGh0dHBzOi8vcnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC8pLCBjaG9vc2UgdGhlIGZyZWUgdmVyc2lvbiBhbmQgZG93bmxvYWQgdGhlIGZpbGUgYWNjb3JkaW5nIHRvIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4NCg0KT25jZSB5b3UgaGF2ZSBpbnN0YWxsZWQgYm90aCBSIGFuZCBSIFN0dWRpbywgeW91IGRvbid0IG5lZWQgdG8gaW50ZXJhY3QgYXQgYWxsIHdpdGggUi4gWW91IGNhbiBkbyBldmVyeXRoaW5nIHlvdSBuZWVkIGZyb20gd2l0aGluIFIgU3R1ZGlvLg0KDQoqKk5vdGU6KiogUiBTdHVkaW8gY2FuIGRvIGV2ZXJ5dGhpbmcgdGhhdCBSIGNhbiwgYnV0IFIgY2Fubm90IGRvIGV2ZXJ5dGhpbmcgdGhhdCBSIFN0dWRpbyBkb2VzDQo8YnI+DQoNCioqKg0KIyAzLkdldHRpbmcgc3RhcnRlZCB3aXRoIFIgU3R1ZGlvICANCg0KIyMgMy4xLiAgV29ya2luZyBkaXJlY3RvcnkNCg0KU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gSW4gYSByZWFsLWxpZmUgc2l0dWF0aW9uLCB0aGlzIGlzIHdoZXJlIHlvdSBzYXZlZCB5b3VyIGRhdGEuDQpgYGB7ciwgZXZhbD1GQUxTRX0NCnNldHdkKCJjb3B5L3RoZS9QYXRoL3RvL3lvdXIvZm9sZGVyL2hlcmUiKQ0KYGBgDQoNCklmIHlvdSBhcmUgdW5zdXJlIHdoZXJlIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcywgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uIGBnZXR3ZCgpYCwgd2hpY2ggbGl0ZXJhbGx5IG1lYW5zOiAiZ2V0IHdvcmtpbmcgZGlyZWN0b3J5Ii4gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUgcHJpbnRlZCBvbiB5b3VyIGNvbnNvbGUuDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KZ2V0d2QoKQ0KYGBgDQo8YnI+DQoNCioqKg0KIyMgMy4yLiBPcGVuIGEgbmV3IHNjcmlwdA0KDQpHbyB0byB0aGUgdG9wIGxlZnQgY29ybmVyLCB1bmRlcm5lYXRoIHRoZSAiRmlsZSIgbWVudSwgYW5kIGNsaWNrIG9uIHRoZSBpY29uIHdpdGggYSBwbHVzIHNpZ24uIFRoYXQgd2lsbCBvcGVuIGEgbmV3IHNjcmlwdCBmb3IgeW91IHRvIHR5cGUgeW91ciBjb21tYW5kcy4NCjxicj4NCg0KKioqDQojIyAzLjMuIEluc3RhbGxpbmcgcGFja2FnZXMNCg0KSW5zdGFsbGluZyBwYWNrYWdlcyBjYW4gYmUgZG9uZSBieSBjb2Rpbmcgb3IgY2xpY2tpbmcgb24gdGhlICJUb29scyIgdGFiIG9mIHRoZSBSIFN0dWRpbyBiYXIuIFlvdSBvbmx5IG5lZWQgdG8gaW5zdGFsbCBwYWNrYWdlcyBvbmNlICh1bmxlc3MgeW91IGNoYW5nZSBjb21wdXRlciBvciB0aGVyZSBpcyBhbiB1cGRhdGUpLg0KDQpUaGUgY29kZSBmb3IgaW5zdGFsbGluZyBwYWNrYWdlcyBpcyBhcyBmb2xsb3dzOg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCg0KI29uZSB0aW1lIGluc3RhbGF0aW9uDQoNCmluc3RhbGwucGFja2FnZXMoJ3RpZHl2ZXJzZScpDQppbnN0YWxsLnBhY2thZ2VzKCdoYXZlbicpDQppbnN0YWxsLnBhY2thZ2VzKCJmb3JlaWduIikNCg0KIyBZb3UgY2FuIGFsc28gaW5zdGFsbCBtb3JlIHRoYW4gb25lIHBhY2thZ2UgYXQgYSB0aW1lLCBhZGRpbmcgYSBsZXR0ZXIgImMiIGZvciBjb25jYXRlbmF0ZSBiZWZvcmUgdGhlIG5hbWVzIG9mIHRoZSBwYWNrYWdlcw0KDQppbnN0YWxsLnBhY2thZ2VzKGMoInRpZHl2ZXJzZSIsICJoYXZlbiIpKQ0KDQpgYGANCjxicj4NCg0KKioqDQojIyAzLjQuIExvYWRpbmcgcGFja2FnZXMNCg0KSW5zdGFsbGluZyBwYWNrYWdlcyBpcyB0aGUgZmlyc3Qgc3RlcCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gYWRkIGFub3RoZXIgc3RlcCB0byBhY3R1YWxseSBiZSBhYmxlIHRvIHVzZSB0aGVtLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGhhcyB0byBiZSBkb25lIGVhY2ggdGltZSB5b3Ugc3RhcnQgYSBuZXcgc2Vzc2lvbiBpbiBSIG9yIFIgU3R1ZGlvLg0KDQpFdmVyeSB0aW1lIHRoYXQgeW91IHN0YXJ0IGEgbmV3IGRhdGEgYW5hbHlzaXMgcHJvamVjdCwgaXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIHN0YXJ0IHlvdXIgc2NyaXB0IHdpdGggbG9hZGluZyB0aGUgcGFja2FnZXMgdGhhdCB5b3Ugd2FudCB0byB1c2UuIFlvdSBkb24ndCBuZWVkIHRvIGFkZCB0aGVtIGFsbCBhdCBvbmNlLCBidXQgaXQgbWFrZXMgZm9yIHRpZGllciBhbmQgbW9yZSBlZmZpY2llbnQgY29kaW5nIGlmIHlvdSBkbyBzby4NCg0KV2hlbiBpbnN0YWxsaW5nLCBwYWNrYWdlcyBhcmUgZG93bmxvYWRlZCB0byBhIGBsaWJyYXJ5YCAoYSBmb2xkZXIgaW4geW91ciBjb21wdXRlciksIHNvIHdoZW4gd2Ugd2FudCB0byBsb2FkIHBhY2thZ2VzIHRvIFIsIHdlIHVzZSB0aGUgZnVuY3Rpb24gYGxpYnJhcnlgLg0KDQpgYGB7cn0NCiMgTG9hZGluZyBwYWNrYWdlcyAobG9hZCB0aGUgcGFja2FnZXMgaW4gZXZlcnkgc2Vzc2lvbiEpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkoZm9yZWlnbikNCmBgYA0KPGJyPg0KDQoqKioNCiMjIDMuNS4gIERhdGEgdHlwZXMgYW5kIHN0cnVjdHVyZXMNCg0KQ3JlYXRpbmcgdmFyaWFibGVzICh2ZWN0b3JzKSBvZiBsZW5ndGggMSwgdXNpbmcgdGhlIGFzc2lnbiBhcnJvdw0KDQpgYGB7cn0NCmEgPC0gMw0KYiA8LSA1DQpjIDwtIDkNCmBgYA0KDQpXZSBjYW4gcGVyZm9ybSBiYXNpYyBvcGVyYXRpb25zIHdpdGggdmFyaWFibGVzDQoNCmBgYHtyfQ0KYipjDQpgYGANCg0KV2UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IHRvIGEgbmV3IHZhcmlhYmxlIGNhbGxlZCAnZCcNCg0KYGBge3J9DQpkIDwtIGIqYy9hDQpgYGANCg0KYW5kIHRoZW4sIHNlZSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICJkIg0KDQpgYGB7cn0NCmQNCmBgYA0KPGJyPg0KDQoqKioNCiMgNC4gTG9hZGluZy9JbXBvcnRpbmcgZGF0YSBpbnRvIFINCg0KVGhlIGZ1bmN0aW9uIHdlIHVzZSB0byBpbXBvcnQgZGF0YSBpbnRvIFIgd2lsbCBkZXBlbmQgb24gdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZGF0YSBpcy4gRGF0YSBpbiBgLmRhdGAsIGAudHh0YCBvciBgLmNzdmAgZm9ybWF0cyBjYW4gYmUgcmVhZCB1c2luZyBiYXNlIFIgZnVuY3Rpb25zIChkb24ndCBuZWVkIHRvIHVzZSBhbnkgcGFja2FnZSksIGJ1dCBkYXRhIGluIFN0YXRhLCBTUFNTIG9yIFNBUyBmb3JtYXQsIHRvIG5hbWUgYSBmZXcsIG5lZWQgYSBzcGVjaWFsIHBhY2thZ2UuDQoNClRoZSBwYWNrYWdlIFtoYXZlbl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2hhdmVuL2hhdmVuLnBkZikgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGltcG9ydCBTdGF0YSBhbmQgU1BTUyBkYXRhIGZpbGVzLg0KDQpFYWNoIG9mIHRoZXNlIHBhY2thZ2VzIGhhcyBhIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHJlYWQgYSBzcGVjaWZpYyBkYXRhc2V0LiBZb3UgY2FuIGNoZWNrIHRoZSBwYWNrYWdlIGRvY3VtZW50YXRpb24gKGxpbmtlZCBhYm92ZSkgb3IgYSBzaW1wbGUgR29vZ2xlIHNlYXJjaCB0byBnZXQgeW91ciBhbnN3ZXIuDQoNClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyB0byByZWFkIGluIGEgYC5kYXRgIGZpbGUgZnJvbTogV3JpZ2h0LCBELiBhbmQgTG9uZG9uLCBLLiAoMjAxMSkuIE1vZGVybiBSZWdyZXNzaW9uIFRlY2huaXF1ZXMgVXNpbmcgUiwgTG9uZG9uOiBTYWdlLiAoQ2hhcHRlciA4KS4gV2UgdXNlIHRoZSBiYXNlIHBhY2thZ2UgZnVuY3Rpb24gYHJlYWQuZGVsaW1gLCBhcyBzdWNoDQoNCmBgYHtyLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCm15ZGF0YSA8LSByZWFkLmRlbGltKCIyNjkzNF9leGVyY2lzZS5kYXQiKQ0KDQpgYGANCg0KWW91IGNhbiBhbHNvIHJlYWQgb25saW5lIGRhdGEgZGlyZWN0bHkgaWYgeW91IHNwZWNpZnkgdGhlIGxpbmssIGFzIHN1Y2g6DQoNCiooVGhpcyBpcyBmcm9tIFdyaWdodCBhbmQgTG9uZG9uJ3MgYm9vayB3ZWJzaXRlIGNvbXBhbmlvbi4gSXQncyB0aGUgc2FtZSBkYXRhIGFzIGJlZm9yZS4gWW91IGNhbiB1c2UgYW55IG9mIHRoZSB0d28gY29kZXMpKg0KDQo8YnI+DQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GLCBldmFsPUZ9DQpteWRhdGE8LXJlYWQuZGVsaW0oImh0dHBzOi8vdXMuc2FnZXB1Yi5jb20vc2l0ZXMvZGVmYXVsdC9maWxlcy91cG0tYmluYXJpZXMvMjY5MzRfZXhlcmNpc2UuZGF0IikNCmBgYA0KPGJyPg0KDQoqKioNCiMgNS4gRXhwbG9yZSB0aGUgZGF0YQ0KDQpJZiB5b3Ugd2FudCB0byBicm93c2UgdGhlIGRhdGEgdG8gc2VlIHdoYXQgaXQgY29udGFpbnMsIHlvdSBjYW4gc2ltcGx5IGNsaWNrIG9uIHRoZSAiRW52aXJvbm1lbnQiIHRhYiBhbmQgdGhlbiBjbGljayBvbiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29kZToNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RiwgZXZhbD1GfQ0KVmlldyhteWRhdGEpDQpgYGANCg0KT3IgeW91IGNhbiBwcmludCB0aGUgZmlyc3Qgc2l4IHJvd3Mgb2YgZGF0YSBieSB0eXBpbmc6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpoZWFkKG15ZGF0YSkNCmBgYA0KDQpUbyBvYnRhaW4gZGVzY3JpcHRpdmUgc3RhdGlzdGljcywgeW91IGNhbiB0eXBlOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GfQ0KbWVhbihteWRhdGEkc3F3MiwgbmEucm09VCkgIyBuYS5ybT1UIGlzIHVzZWQgdG8gcmVtb3ZlIG1pc3NpbmcgdmFsdWVzDQoNCnNkKG15ZGF0YSRzcXcyLCBuYS5ybT1UKSAjIHRoYXQgd2lsbCBnaXZlIHlvdSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmBgYA0KDQpBIG11Y2ggZmFzdGVyIHdheSBvZiBvYnRhaW5pbmcgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHZhcmlhYmxlIGlzIHRvIHVzZSB0aGUgYHN1bW1hcnlgIGZ1bmN0aW9uOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GfQ0Kc3VtbWFyeShteWRhdGEkc3F3MikNCmBgYA0KDQpJbiB0aGUgbmV4dCBwcmFjdGljYWwsIHlvdSB3aWxsIGdldCB0byB1c2UgbW9yZSBmdW5jdGlvbnMuIFRoaXMgaXMganVzdCB0aGUgZmlyc3QgdGFzdGVyLg0KPGJyPg0KDQoqKioNCiMgQm9udXMgdHJhY2sNCg0KSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UndmUgYmVlbiBjb2RpbmcsIHRoZW4geW91IG5lZWQgdG8gYmUgImluaXRpYXRlZCIuIFR5cGUgdGhlIGZvbGxvd2luZyBvbiB5b3VyIFIgc2NyaXB0Og0KDQpgYGAge3J9DQpteWZpcnN0cHJvZ3JhbW1lPC1mdW5jdGlvbigpIHsNCnByaW50KCJIZWxsbyBXb3JsZCEiKQ0KfQ0KYGBgDQoNCkFuZCB0aGVuIHR5cGU6DQoNCmBgYHtyfQ0KbXlmaXJzdHByb2dyYW1tZSgpDQoNCmBgYA0KDQpXZWxjb21lIHRvIHdvcmxkIG9mIGNvZGluZyENCjxjZW50ZXI+DQohW10oaHR0cHM6Ly9tZWRpYS5naXBoeS5jb20vbWVkaWEvTG1Od3JCaGVqa0s5RUZQNTA0L2dpcGh5LmdpZikNCjwvY2VudGVyPg==
Patricio Troncoso
patricio.troncoso@manchester.ac.uk