Because R is a full language, rather than a point-and-click interface, it is important that we understand the general grammar and how to use it.

Assignments & Interactivity

This document is an R Notebook. It is written in R Markdown which allows you to mix in regular text (like this) with R code, analyses, and output as a single document. This is a particularly helpful approach to working with data as you keep your code, raw data, analyses, and output all within a single area—thus making your research more Reproducible. If you would like to download a copy of these data, select Download Rmd from the Code menu at top right of this page and it this web document will produce the raw markdown you can view in RStudio.

In this section, I take a brief detour to cover some of the most basic aspects of interacting with R. I’ll assume that you are interacting with it in the Console. First, the R language specification makes a distinction between the assignment of a value to a variable and the query as to the equality of two objects. In doing so, we do not use a single equals sign (e.g., =) for either of these operations.

Variable Assignment

Assignment requires two things (1) you must have a value or object and (2) you must have a variable or object to assign it to. Instead of using a single equals character for this, R uses two characters in a sequence (no spaces between them) to denote assignment of a value (or set of values) to an object. For example, the code below assigns the statement not a loser (which is a character data type) to a variable named dr_dyer (phew, that was close!).

dr_dyer <- "not a loser"

Notice how the assignment operator is actually two separate characters, a less than sign and a dash right next together. If you read it as a statement, it says,

Dr Dyer is assigned the value of ‘not a loser’

This approach has directionality to it, as it looks a bit like an arrow. For completeness, the reverse pointing arrow is also permissible.

"still not a loser" -> dr_dyer

Notice here that we are taking the value and assigning it to the variable.

The only rule here is that the arrow must always point towards the entity receiving the data.

For conventions, I’ll stick mostly with the former throughout all the presentations for simplicity but your own coding style and your desire to craft more readable (and hense less-sucky) code will determine when each is more appropriate.

Equality

Determining if two things are equal is another case where one could use the old = character. R has decided against using it like this for clarity, readability, and general “make-sure-you-do-not-mistype-what-you-want-ability”. Instead of a single equals sign, we have two of them, right next to each other.

2 == 2
[1] TRUE
dr_dyer == "a loser"
[1] FALSE

In this case, it is true, all values of 2 are identical to 2 and there is no indication that dr_dyer is a loser. Notice the responses here are TRUE and FALSE (both actual logical variables as described below). Also notice how the variables assigned in the chuncks of code above (e.g., the dr_dyer part) are available throughout the document! One of the really cool consequences of using markdown (imho).

Case Sensitivity

This is totally going to bite you in the back side as you learn R, because generally humans are sloppy typists. The R language is case-sensitive! This means that the variables are different if they are not typed exactly the same.

x <- 21
X <- 42
x == X
[1] FALSE

Variable Naming

While we are on the subject of typecase, it is important to say a few things about how we pick our variables. If you want your “future self” to absolutely loath your “present self” then use variables like:

x <- 21
x2 <- 42
x43 <- "bob"

which tells the person reading the code absolutely nothing about what the variable is representing.

Conversely, if you want to make friends and influence people through your code, try naming variables in a way that represents what they are being used for so that when you come back to this code later, it makes sense.

the_meaning_of_life <- 42
dr_dyers_loser_status <- FALSE
depthOfTheRiver <- 32.345
number.of.tacos.eaten <- 4

Here are the base rules for making a variable name:

  • It must start with a letter.
  • It cannot have any spaces in it.
  • It can have numbers or a few symbols within it (only if they actually do some good at making it more readable).
  • They are all case sensitive (e.g., Bob, BOb, BoB, boB, bOB, and Robert are all completely different variable names).

All variables in R have an intrinsic knowledge of what class of variable they belong to (e.g., numeric, logical, etc.). You can ask a variable about it’s class using the function class().

class( the_meaning_of_life )
[1] "numeric"
numeric
class( dr_dyers_loser_status )
[1] "logical"
logical

These will become more important later on when we look at coercion.

LS0tCnRpdGxlOiAiUiBHcmFtbWFyIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICAgIGNzczogImVudnM1NDMtc3R5bGVzLmNzcyIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KICBsaWJyYXJ5KGVtbykKYGBgCgpCZWNhdXNlIGBSYCBpcyBhIGZ1bGwgbGFuZ3VhZ2UsIHJhdGhlciB0aGFuIGEgYHBvaW50LWFuZC1jbGlja2AgaW50ZXJmYWNlLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSB1bmRlcnN0YW5kIHRoZSBnZW5lcmFsIGdyYW1tYXIgYW5kIGhvdyB0byB1c2UgaXQuCgoKIyBBc3NpZ25tZW50cyAmIEludGVyYWN0aXZpdHkKClRoaXMgZG9jdW1lbnQgaXMgYW4gW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHllcmxhYi5naXRodWIuaW8vRU5WUy1MZWN0dXJlcy9ub3RlYm9va3Mvc2xpZGVzLmh0bWwpLiAgSXQgaXMgd3JpdHRlbiBpbiBbUiBNYXJrZG93bl0oaHR0cHM6Ly9keWVybGFiLmdpdGh1Yi5pby9FTlZTLUxlY3R1cmVzL21hcmtkb3duL3NsaWRlcy5odG1sKSB3aGljaCBhbGxvd3MgeW91IHRvIG1peCBpbiByZWd1bGFyIHRleHQgKGxpa2UgdGhpcykgd2l0aCBgUmAgY29kZSwgYW5hbHlzZXMsIGFuZCBvdXRwdXQgYXMgYSBzaW5nbGUgZG9jdW1lbnQuICBUaGlzIGlzIGEgcGFydGljdWxhcmx5IGhlbHBmdWwgYXBwcm9hY2ggdG8gd29ya2luZyB3aXRoIGRhdGEgYXMgeW91IGtlZXAgeW91ciBjb2RlLCByYXcgZGF0YSwgYW5hbHlzZXMsIGFuZCBvdXRwdXQgYWxsIHdpdGhpbiBhIHNpbmdsZSBhcmVh4oCUdGh1cyBtYWtpbmcgeW91ciByZXNlYXJjaCBtb3JlIFtSZXByb2R1Y2libGVdKGh0dHBzOi8vZHllcmxhYi5naXRodWIuaW8vRU5WUy1MZWN0dXJlcy9yZXByb2R1Y2libGVfcmVzZWFyY2gvc2xpZGVzLmh0bWwpLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gZG93bmxvYWQgYSBjb3B5IG9mIHRoZXNlIGRhdGEsIHNlbGVjdCBgRG93bmxvYWQgUm1kYCBmcm9tIHRoZSBgQ29kZWAgbWVudSBhdCB0b3AgcmlnaHQgb2YgdGhpcyBwYWdlIGFuZCBpdCB0aGlzIHdlYiBkb2N1bWVudCB3aWxsIHByb2R1Y2UgdGhlIHJhdyBtYXJrZG93biB5b3UgY2FuIHZpZXcgaW4gW1JTdHVkaW9dKGh0dHBzOi8vcnN0dWRpby5jb20pLgoKSW4gdGhpcyBzZWN0aW9uLCBJIHRha2UgYSBicmllZiBkZXRvdXIgdG8gY292ZXIgc29tZSBvZiB0aGUgbW9zdCBiYXNpYyBhc3BlY3RzIG9mIGludGVyYWN0aW5nIHdpdGggYFJgLiAgSSdsbCBhc3N1bWUgdGhhdCB5b3UgYXJlIGludGVyYWN0aW5nIHdpdGggaXQgaW4gdGhlICpDb25zb2xlKi4gIEZpcnN0LCB0aGUgYFJgIGxhbmd1YWdlIHNwZWNpZmljYXRpb24gbWFrZXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBhc3NpZ25tZW50IG9mIGEgdmFsdWUgdG8gYSB2YXJpYWJsZSBhbmQgdGhlIHF1ZXJ5IGFzIHRvIHRoZSBlcXVhbGl0eSBvZiB0d28gb2JqZWN0cy4gIEluIGRvaW5nIHNvLCB3ZSBkbyBub3QgdXNlIGEgc2luZ2xlIGVxdWFscyBzaWduIChlLmcuLCBgPWApIGZvciBlaXRoZXIgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gIAoKIyMgVmFyaWFibGUgQXNzaWdubWVudAoKQXNzaWdubWVudCByZXF1aXJlcyB0d28gdGhpbmdzICgxKSB5b3UgbXVzdCBoYXZlIGEgdmFsdWUgb3Igb2JqZWN0IGFuZCAoMikgeW91IG11c3QgaGF2ZSBhIHZhcmlhYmxlIG9yIG9iamVjdCB0byBhc3NpZ24gaXQgdG8uICBJbnN0ZWFkIG9mIHVzaW5nIGEgc2luZ2xlIGVxdWFscyBjaGFyYWN0ZXIgZm9yIHRoaXMsIGBSYCB1c2VzIHR3byBjaGFyYWN0ZXJzIGluIGEgc2VxdWVuY2UgKG5vIHNwYWNlcyBiZXR3ZWVuIHRoZW0pIHRvIGRlbm90ZSAqYXNzaWdubWVudCogb2YgYSB2YWx1ZSAob3Igc2V0IG9mIHZhbHVlcykgdG8gYW4gb2JqZWN0LiAgRm9yIGV4YW1wbGUsIHRoZSBjb2RlIGJlbG93IGFzc2lnbnMgdGhlIHN0YXRlbWVudCAqbm90IGEgbG9zZXIqICh3aGljaCBpcyBhIGNoYXJhY3RlciBkYXRhIHR5cGUpIHRvIGEgdmFyaWFibGUgbmFtZWQgYGRyX2R5ZXJgIChwaGV3LCB0aGF0IHdhcyBjbG9zZSEpLgoKYGBge3J9CmRyX2R5ZXIgPC0gIm5vdCBhIGxvc2VyIgpgYGAKCk5vdGljZSBob3cgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgaXMgYWN0dWFsbHkgdHdvIHNlcGFyYXRlIGNoYXJhY3RlcnMsIGEgKmxlc3MgdGhhbiogc2lnbiBhbmQgYSAqZGFzaCogcmlnaHQgbmV4dCB0b2dldGhlci4gIElmIHlvdSByZWFkIGl0IGFzIGEgc3RhdGVtZW50LCBpdCBzYXlzLCAKCj4gRHIgRHllciBpcyBhc3NpZ25lZCB0aGUgdmFsdWUgb2YgJ25vdCBhIGxvc2VyJwoKVGhpcyBhcHByb2FjaCBoYXMgKmRpcmVjdGlvbmFsaXR5KiB0byBpdCwgYXMgaXQgbG9va3MgYSBiaXQgbGlrZSBhbiBhcnJvdy4gIEZvciBjb21wbGV0ZW5lc3MsIHRoZSByZXZlcnNlIHBvaW50aW5nIGFycm93IGlzIGFsc28gcGVybWlzc2libGUuCgpgYGB7cn0KInN0aWxsIG5vdCBhIGxvc2VyIiAtPiBkcl9keWVyCmBgYAoKTm90aWNlIGhlcmUgdGhhdCB3ZSBhcmUgdGFraW5nIHRoZSB2YWx1ZSBhbmQgYXNzaWduaW5nIGl0IHRvIHRoZSB2YXJpYWJsZS4gIAoKPGRpdiBjbGFzcz0iYm94LXJlZCI+VGhlIG9ubHkgcnVsZSBoZXJlIGlzIHRoYXQgdGhlIGFycm93IG11c3QgKiphbHdheXMqKiBwb2ludCB0b3dhcmRzIHRoZSBlbnRpdHkgcmVjZWl2aW5nIHRoZSBkYXRhLiAgPC9kaXY+CgpGb3IgY29udmVudGlvbnMsIEknbGwgc3RpY2sgbW9zdGx5IHdpdGggdGhlIGZvcm1lciB0aHJvdWdob3V0IGFsbCB0aGUgcHJlc2VudGF0aW9ucyBmb3Igc2ltcGxpY2l0eSBidXQgeW91ciBvd24gY29kaW5nIHN0eWxlIGFuZCB5b3VyIGRlc2lyZSB0byBjcmFmdCBtb3JlIHJlYWRhYmxlIChhbmQgaGVuc2UgbGVzcy1zdWNreSkgY29kZSB3aWxsIGRldGVybWluZSB3aGVuIGVhY2ggaXMgbW9yZSBhcHByb3ByaWF0ZS4KCiMjIEVxdWFsaXR5CgpEZXRlcm1pbmluZyBpZiB0d28gdGhpbmdzIGFyZSBlcXVhbCBpcyBhbm90aGVyIGNhc2Ugd2hlcmUgb25lIGNvdWxkIHVzZSB0aGUgb2xkIGA9YCBjaGFyYWN0ZXIuICBSIGhhcyBkZWNpZGVkIGFnYWluc3QgdXNpbmcgaXQgbGlrZSB0aGlzIGZvciBjbGFyaXR5LCByZWFkYWJpbGl0eSwgYW5kIGdlbmVyYWwgIm1ha2Utc3VyZS15b3UtZG8tbm90LW1pc3R5cGUtd2hhdC15b3Utd2FudC1hYmlsaXR5Ii4gIEluc3RlYWQgb2YgYSBzaW5nbGUgZXF1YWxzIHNpZ24sIHdlIGhhdmUgdHdvIG9mIHRoZW0sIHJpZ2h0IG5leHQgdG8gZWFjaCBvdGhlci4KCgpgYGB7cn0KMiA9PSAyCmRyX2R5ZXIgPT0gImEgbG9zZXIiCmBgYAoKSW4gdGhpcyBjYXNlLCBpdCBpcyB0cnVlLCBhbGwgdmFsdWVzIG9mIGAyYCBhcmUgaWRlbnRpY2FsIHRvIGAyYCBhbmQgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiB0aGF0IGBkcl9keWVyYCBpcyAqYSBsb3NlciouICBOb3RpY2UgdGhlIHJlc3BvbnNlcyBoZXJlIGFyZSBgVFJVRWAgYW5kIGBGQUxTRWAgKGJvdGggYWN0dWFsIGxvZ2ljYWwgdmFyaWFibGVzIGFzIGRlc2NyaWJlZCBiZWxvdykuIEFsc28gbm90aWNlIGhvdyB0aGUgdmFyaWFibGVzIGFzc2lnbmVkIGluIHRoZSBjaHVuY2tzIG9mIGNvZGUgYWJvdmUgKGUuZy4sIHRoZSBgZHJfZHllcmAgcGFydCkgYXJlIGF2YWlsYWJsZSB0aHJvdWdob3V0IHRoZSBkb2N1bWVudCEgIE9uZSBvZiB0aGUgcmVhbGx5IGNvb2wgY29uc2VxdWVuY2VzIG9mIHVzaW5nIG1hcmtkb3duIChpbWhvKS4KCiMjIENhc2UgU2Vuc2l0aXZpdHkKClRoaXMgaXMgdG90YWxseSBnb2luZyB0byBiaXRlIHlvdSBpbiB0aGUgYmFjayBzaWRlIGFzIHlvdSBsZWFybiBSLCBiZWNhdXNlIGdlbmVyYWxseSBodW1hbnMgYXJlIHNsb3BweSB0eXBpc3RzLiAgVGhlIGBSYCBsYW5ndWFnZSBpcyBjYXNlLXNlbnNpdGl2ZSEgIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFyaWFibGVzIGFyZSBkaWZmZXJlbnQgaWYgdGhleSBhcmUgbm90IHR5cGVkICoqZXhhY3RseSoqIHRoZSBzYW1lLgoKYGBge3J9CnggPC0gMjEKWCA8LSA0Mgp4ID09IFgKYGBgCiMjIFZhcmlhYmxlIE5hbWluZwogCgpXaGlsZSB3ZSBhcmUgb24gdGhlIHN1YmplY3Qgb2YgdHlwZWNhc2UsIGl0IGlzIGltcG9ydGFudCB0byBzYXkgYSBmZXcgdGhpbmdzIGFib3V0IGhvdyB3ZSBwaWNrIG91ciB2YXJpYWJsZXMuICBJZiB5b3Ugd2FudCB5b3VyICJmdXR1cmUgc2VsZiIgdG8gYWJzb2x1dGVseSBsb2F0aCB5b3VyICJwcmVzZW50IHNlbGYiIHRoZW4gdXNlIHZhcmlhYmxlcyBsaWtlOgoKYGBge3J9CnggPC0gMjEKeDIgPC0gNDIKeDQzIDwtICJib2IiCmBgYAoKd2hpY2ggdGVsbHMgdGhlIHBlcnNvbiByZWFkaW5nIHRoZSBjb2RlICphYnNvbHV0ZWx5IG5vdGhpbmcqIGFib3V0IHdoYXQgdGhlIHZhcmlhYmxlIGlzIHJlcHJlc2VudGluZy4gIAoKQ29udmVyc2VseSwgaWYgeW91IHdhbnQgdG8gKm1ha2UgZnJpZW5kcyBhbmQgaW5mbHVlbmNlIHBlb3BsZSogdGhyb3VnaCB5b3VyIGNvZGUsIHRyeSBuYW1pbmcgdmFyaWFibGVzIGluIGEgd2F5IHRoYXQgcmVwcmVzZW50cyB3aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgZm9yIHNvIHRoYXQgd2hlbiB5b3UgY29tZSBiYWNrIHRvIHRoaXMgY29kZSBsYXRlciwgaXQgbWFrZXMgc2Vuc2UuCgpgYGB7cn0KdGhlX21lYW5pbmdfb2ZfbGlmZSA8LSA0Mgpkcl9keWVyc19sb3Nlcl9zdGF0dXMgPC0gRkFMU0UKZGVwdGhPZlRoZVJpdmVyIDwtIDMyLjM0NQpudW1iZXIub2YudGFjb3MuZWF0ZW4gPC0gNApgYGAKCkhlcmUgYXJlIHRoZSBiYXNlIHJ1bGVzIGZvciBtYWtpbmcgYSB2YXJpYWJsZSBuYW1lOiAgCgogIC0gSXQgKm11c3QqIHN0YXJ0IHdpdGggYSBsZXR0ZXIuICAKICAtIEl0IGNhbm5vdCBoYXZlIGFueSBzcGFjZXMgaW4gaXQuICAKICAtIEl0IGNhbiBoYXZlIG51bWJlcnMgb3IgYSBmZXcgc3ltYm9scyB3aXRoaW4gaXQgKG9ubHkgaWYgdGhleSBhY3R1YWxseSBkbyBzb21lIGdvb2QgYXQgbWFraW5nIGl0IG1vcmUgcmVhZGFibGUpLgogIC0gVGhleSBhcmUgKmFsbCogY2FzZSBzZW5zaXRpdmUgKGUuZy4sIGBCb2JgLCBgQk9iYCwgYEJvQmAsIGBib0JgLCBgYk9CYCwgYW5kIGBSb2JlcnRgIGFyZSBhbGwgY29tcGxldGVseSBkaWZmZXJlbnQgdmFyaWFibGUgbmFtZXMpLgoKCkFsbCB2YXJpYWJsZXMgaW4gYFJgIGhhdmUgYW4gaW50cmluc2ljIGtub3dsZWRnZSBvZiB3aGF0ICpjbGFzcyogb2YgdmFyaWFibGUgdGhleSBiZWxvbmcgdG8gKGUuZy4sIG51bWVyaWMsIGxvZ2ljYWwsIGV0Yy4pLiAgWW91IGNhbiBhc2sgYSB2YXJpYWJsZSBhYm91dCBpdCdzIGNsYXNzIHVzaW5nIHRoZSBmdW5jdGlvbiBgY2xhc3MoKWAuCgpgYGB7cn0KY2xhc3MoIHRoZV9tZWFuaW5nX29mX2xpZmUgKQpjbGFzcyggZHJfZHllcnNfbG9zZXJfc3RhdHVzICkKYGBgCgpUaGVzZSB3aWxsIGJlY29tZSBtb3JlIGltcG9ydGFudCBsYXRlciBvbiB3aGVuIHdlIGxvb2sgYXQgY29lcmNpb24uCgoKCg==