---
#############################################################
# #
# In RStudio click on "Run Document" to run this tutorial #
# #
#############################################################
title: "A Brief Overview of R"
author: "Luke Tierney"
output: learnr::tutorial
runtime: shiny_prerendered
---
```{r setup, include=FALSE}
library(learnr)
library(tidyverse)
knitr::opts_chunk$set(echo = FALSE, comment = "", warning = FALSE)
```
```{r stop_when_browser_closes, context = "server"}
# stop the app when the browser is closed (or, unfortunately, refreshed)
session$onSessionEnded(stopApp)
```
## Basic Usage
Use the colon operator to create the sequence 3, 2, 1.
```{r down-colon, exercise = TRUE}
```
```{r down-colon-solution}
3 : 1
```
What happens if you add `(1 : 3)` and `(4 : 5)`?
```{r recycle-non-multiple, warning = TRUE, exercise = TRUE}
```
```{r recycle-non-multiple-hint}
(1 : 3) + (4 : 5)
```
## Data Frames
### Counting Rows and Columns
How many rows and columns does the `faithful` data frame have?
```{r faithful-nr, exercise = TRUE}
```
**Hint:** Try `nrow()`, `ncol()`, or `dim()`.
### Making New Data Frames
You can use `data.frame()` to create a data frame. For example:
```{r}
data.frame(x = 1 : 4, y = rnorm(4))
```
What happens if you try to create a data frame with variables that are
not all the same length?
```{r data-frame-uneq, exercise = TRUE}
```
```{r data-frame-uneq-hint}
data.frame(x = 1 : 4, y = rnorm(3))
```
## Functions
The sum of the integers $1, 2, \dots, n$ is given $n \times (n + 1) / 2$.
Write a function `nsum()` that takes as argument `n` and computed this value.
```{r intsum, exercise = TRUE}
```
```{r intsum-hint, eval = FALSE}
nsum <- function(n) ___
```
```{r intsum-solution}
nsum <- function(n) n * (n + 1) / 2
```
What happens when you evaluate `nsum(1 : 5)`?
```{r intsum-vec-setup}
nsum <- function(n) n * (n + 1) / 2
```
```{r intsum-vec, exercise = TRUE}
```
## The Tidyverse
The `mtcars` data set contains data on some (very old) car models.
```{r}
head(mtcars, 4)
```
Write a pipeline to compute the average `mpg` values for 4, 6, and 8
cylinder cars.
```{r cyl-mpg-setup}
library(dplyr)
```
```{r cyl-mpg, exercise = TRUE}
```
```{r cyl-mpg-hint, eval = FALSE}
mtcars %>%
group_by(___) %>%
summarize(acg_mpg = ___)
```
## Exercises
### Exercise 1
Compute the mean of the numbers 1, 3, 5, 8.
```{r simple_mean, exercise = TRUE}
```
```{r simple_mean-solution}
mean(c(1, 3, 5, 8))
```
```{r simple_mean-question, echo = FALSE}
question("The answer is closest to:",
answer("5.75"),
answer("4.25", correct = TRUE),
answer("3.75"),
answer("5.25"),
random_answer_order = TRUE,
allow_retry = TRUE
)
```
### Exercise 2
What is the mean of the `eruptions` variable in the `faithful` data
frame?
```{r eruptions_mean, exercise = TRUE}
```
```{r eruptions_mean-solution}
mean(faithful$eruptions)
```
```{r eruptions_mean-question, echo = FALSE}
question("The answer is closest to:",
answer("3.35"),
answer("3.49", correct = TRUE),
answer("3.87"),
answer("3.16"),
random_answer_order = TRUE,
allow_retry = TRUE
)
```
### Exercise 3
Find the average of the first 50 eruption durations in the faithful`
data frame.
```{r eruptions50_mean, exercise = TRUE}
```
```{r eruptions50_mean-solution}
mean(faithful$eruptions[1 : 50])
```
```{r eruptions50_mean-question, echo = FALSE}
question("The answer is closest to:",
answer("2.50"),
answer("3.30", correct = TRUE),
answer("3.13"),
answer("4.33"),
random_answer_order = TRUE,
allow_retry = TRUE
)
```
### Exercise 4
Use the `median` function to modify the pipe example in the tidyverse
section to include medians.
```{r add_median, exercise = TRUE}
```
```{r, add_median-hint, eval = FALSE}
faithful %>%
mutate(type = ifelse(eruptions < 3, "short", "long")) %>%
group_by(type) %>%
summarize(mean = mean(waiting),
___,
sd = sd(waiting))
```
```{r add_median-solution}
faithful %>%
mutate(type = ifelse(eruptions < 3, "short", "long")) %>%
group_by(type) %>%
summarize(mean = mean(waiting),
median = median(waiting),
sd = sd(waiting))
```