209 lines
7.0 KiB
Plaintext
209 lines
7.0 KiB
Plaintext
# Workflow: basics
|
||
|
||
You now have some experience running R code.
|
||
We didn't give you many details, but you've obviously figured out the basics, or you would've thrown this book away in frustration!
|
||
Frustration is natural when you start programming in R, because it is such a stickler for punctuation, and even one character out of place will cause it to complain.
|
||
But while you should expect to be a little frustrated, take comfort in that it's both typical and temporary: it happens to everyone, and the only way to get over it is to keep trying.
|
||
|
||
Before we go any further, let's make sure you've got a solid foundation in running R code, and that you know about some of the most helpful RStudio features.
|
||
|
||
## Coding basics
|
||
|
||
Let's review some basics we've so far omitted in the interests of getting you plotting as quickly as possible.
|
||
You can use R as a calculator:
|
||
|
||
```{r}
|
||
1 / 200 * 30
|
||
(59 + 73 + 2) / 3
|
||
sin(pi / 2)
|
||
```
|
||
|
||
You can create new objects with `<-`:
|
||
|
||
```{r}
|
||
x <- 3 * 4
|
||
```
|
||
|
||
You can **c**ombine multiple elements into a vector with `c()`:
|
||
|
||
```{r}
|
||
primes <- c(1, 2, 3, 5, 7, 11, 13)
|
||
```
|
||
|
||
And basic arithmetic is applied to every element of the vector:
|
||
|
||
```{r}
|
||
primes * 2
|
||
primes - 1
|
||
```
|
||
|
||
All R statements where you create objects, **assignment** statements, have the same form:
|
||
|
||
```{r}
|
||
#| eval: false
|
||
object_name <- value
|
||
```
|
||
|
||
When reading that code say "object name gets value" in your head.
|
||
|
||
You will make lots of assignments and `<-` is a pain to type.
|
||
Don't be lazy and use `=`: it will work, but it will cause confusion later.
|
||
Instead, use RStudio's keyboard shortcut: Alt + - (the minus sign).
|
||
Notice that RStudio automagically surrounds `<-` with spaces, which is a good code formatting practice.
|
||
Code is miserable to read on a good day, so giveyoureyesabreak and use spaces.
|
||
|
||
## Comments
|
||
|
||
R will ignore any text after `#`.
|
||
This allows to you to write **comments**, text that is ignored by R but read by other humans.
|
||
We'll sometimes include comments in examples explaining what's happening with the code.
|
||
|
||
Comments can be helpful for briefly describing what the subsequent code does.
|
||
|
||
```{r}
|
||
# define primes
|
||
primes <- c(1, 2, 3, 5, 7, 11, 13)
|
||
|
||
# multiply primes by 2
|
||
primes * 2
|
||
```
|
||
|
||
With short pieces of code like this, it might not be necessary to leave a command for every single line of code.
|
||
But as the code you're writing gets more complex, comments can save you (and your collaborators) a lot of time in figuring out what was done in the code.
|
||
|
||
However, ultimately, *what* was done is possible to figure out, even if it might be tedious at times, as the code is self-documenting.
|
||
However, remembering or figuring out *why* something was done can be much more difficult, or impossible.
|
||
For example, `geom_smooth()`, which draws a smooth curve to represent the patterns of the data has an argument called `span`, which controls the "wiggliness" of the smoother with larger values for `span` yielding a smoother curve.
|
||
The default value of this argument is 0.75.
|
||
Suppose you decide to change the value of `span`, and set it to 0.3.
|
||
It would be very useful to add a comment noting why you decided to make this change, for yourself in the future and others reviewing your code.
|
||
In the following example the first comment for the same code is not as good as the second one as it doesn't say why the decision to change the span was made.
|
||
|
||
## What's in a name?
|
||
|
||
Object names must start with a letter, and can only contain letters, numbers, `_` and `.`.
|
||
You want your object names to be descriptive, so you'll need a convention for multiple words.
|
||
We recommend **snake_case** where you separate lowercase words with `_`.
|
||
|
||
```{r, eval = FALSE}
|
||
i_use_snake_case
|
||
otherPeopleUseCamelCase
|
||
some.people.use.periods
|
||
And_aFew.People_RENOUNCEconvention
|
||
```
|
||
|
||
We'll come back to names again when we talk more about code style in Chapter \@ref(workflow-style).
|
||
|
||
You can inspect an object by typing its name:
|
||
|
||
```{r}
|
||
x
|
||
```
|
||
|
||
Make another assignment:
|
||
|
||
```{r}
|
||
this_is_a_really_long_name <- 2.5
|
||
```
|
||
|
||
To inspect this object, try out RStudio's completion facility: type "this", press TAB, add characters until you have a unique prefix, then press return.
|
||
|
||
Ooops, you made a mistake!
|
||
`this_is_a_really_long_name` should have value 3.5 not 2.5.
|
||
Use another keyboard shortcut to help you fix it.
|
||
Type "this" then press Cmd/Ctrl + ↑.
|
||
That will list all the commands you've typed that start with those letters.
|
||
Use the arrow keys to navigate, then press enter to retype the command.
|
||
Change 2.5 to 3.5 and rerun.
|
||
|
||
Make yet another assignment:
|
||
|
||
```{r}
|
||
r_rocks <- 2 ^ 3
|
||
```
|
||
|
||
Let's try to inspect it:
|
||
|
||
```{r, eval = FALSE}
|
||
r_rock
|
||
#> Error: object 'r_rock' not found
|
||
R_rocks
|
||
#> Error: object 'R_rocks' not found
|
||
```
|
||
|
||
There's an implied contract between you and R: it will do the tedious computation for you, but in return, you must be completely precise in your instructions.
|
||
Typos matter.
|
||
Case matters.
|
||
|
||
## Calling functions
|
||
|
||
R has a large collection of built-in functions that are called like this:
|
||
|
||
```{r eval = FALSE}
|
||
function_name(arg1 = val1, arg2 = val2, ...)
|
||
```
|
||
|
||
Let's try using `seq()` which makes regular **seq**uences of numbers and, while we're at it, learn more helpful features of RStudio.
|
||
Type `se` and hit TAB.
|
||
A popup shows you possible completions.
|
||
Specify `seq()` by typing more (a `q`) to disambiguate, or by using ↑/↓ arrows to select.
|
||
Notice the floating tooltip that pops up, reminding you of the function's arguments and purpose.
|
||
If you want more help, press F1 to get all the details in the help tab in the lower right pane.
|
||
|
||
Press TAB once more when you've selected the function you want.
|
||
RStudio will add matching opening (`(`) and closing (`)`) parentheses for you.
|
||
Type the arguments `1, 10` and hit return.
|
||
|
||
```{r}
|
||
seq(1, 10)
|
||
```
|
||
|
||
Type this code and notice you get similar assistance with the paired quotation marks:
|
||
|
||
```{r}
|
||
x <- "hello world"
|
||
```
|
||
|
||
Quotation marks and parentheses must always come in a pair.
|
||
RStudio does its best to help you, but it's still possible to mess up and end up with a mismatch.
|
||
If this happens, R will show you the continuation character "+":
|
||
|
||
> x <- "hello
|
||
+
|
||
|
||
The `+` tells you that R is waiting for more input; it doesn't think you're done yet.
|
||
Usually that means you've forgotten either a `"` or a `)`. Either add the missing pair, or press ESCAPE to abort the expression and try again.
|
||
|
||
Now look at your environment in the upper right pane:
|
||
|
||
```{r, echo = FALSE, out.width = NULL}
|
||
knitr::include_graphics("screenshots/rstudio-env.png")
|
||
```
|
||
|
||
Here you can see all of the objects that you've created.
|
||
|
||
## Exercises
|
||
|
||
1. Why does this code not work?
|
||
|
||
```{r, error = TRUE}
|
||
my_variable <- 10
|
||
my_varıable
|
||
```
|
||
|
||
Look carefully!
|
||
(This may seem like an exercise in pointlessness, but training your brain to notice even the tiniest difference will pay off when programming.)
|
||
|
||
2. Tweak each of the following R commands so that they run correctly:
|
||
|
||
```{r, eval = FALSE}
|
||
libary(tidyverse)
|
||
|
||
ggplot(dota = mpg) +
|
||
geom_point(maping = aes(x = displ, y = hwy))
|
||
```
|
||
|
||
3. Press Alt + Shift + K.
|
||
What happens?
|
||
How can you get to the same place using the menus?
|