From d50aa09b800004b3f4ab4f08b5db24ddedc1cffc Mon Sep 17 00:00:00 2001 From: hadley Date: Thu, 18 Aug 2016 16:12:42 -0500 Subject: [PATCH] Proofing vectors --- diagrams/data-structures-overview.png | Bin 7315 -> 76847 bytes vectors.Rmd | 219 ++++++++++++++------------ 2 files changed, 115 insertions(+), 104 deletions(-) diff --git a/diagrams/data-structures-overview.png b/diagrams/data-structures-overview.png index 13dad79197e3e94dbc39f6fd228565591985dc19..b44109ba80f2b320193468bba6e7ab954de5aabe 100644 GIT binary patch literal 76847 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 O@OdjKHSu!7LEgVXO<|A# delta 6877 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 Ssn{P@IO@vUu+NH?A^!#O{RZs- diff --git a/vectors.Rmd b/vectors.Rmd index c214089..d91fdc2 100644 --- a/vectors.Rmd +++ b/vectors.Rmd @@ -1,37 +1,51 @@ +```{r include=FALSE, cache=FALSE} +set.seed(1014) +options(digits = 3) + +knitr::opts_chunk$set( + comment = "#>", + collapse = TRUE, + cache = TRUE, + out.width = "70%", + fig.align = 'center', + fig.width = 6, + fig.asp = 0.618, # 1 / phi + fig.show = "hold" +) + +options(dplyr.print_min = 6, dplyr.print_max = 6) +``` # Vectors ## Introduction -So far this book has focussed on data frames and packages that work with them. But as you start to write your own functions, and dig deeper into R, you need to learn about vectors, the objects that underlie data frames. If you've learned R in a more traditional way, you're probably already familiar with vectors, as most R resources start with vectors and work their way up to data frames. I think it's better to start with data frames because they're immediately useful, and then work your way down to the underlying components. +So far this book has focussed on tibbles and packages that work with them. But as you start to write your own functions, and dig deeper into R, you need to learn about vectors, the objects that underlie tibbles. If you've learned R in a more traditional way, you're probably already familiar with vectors, as most R resources start with vectors and work their way up to tibbles. I think it's better to start with tibbles because they're immediately useful, and then work your way down to the underlying components. -Vectors are particularly important as most of the functions you will write will work with vectors. It is possible to write functions that work with data frames (like ggplot2, dplyr, tidyr, etc), but the underlying technology is more complex and less consistent. I am working on a system to make to it easier, but it will not be ready in time for the publication of the book. This system will still require you understand vectors, but will help provide a user-friendly layer on top. +Vectors are particularly important as most of the functions you will write will work with vectors. It is possible to write functions that work with tibbles (like ggplot2, dplyr, and tidyr), but the tools you need write such functions are currently idiosyncratic and immature. I am working on a better approach, , but it will not be ready in time for the publication of the book. Even when complete, you'll still need you understand vectors, it'll just make it easier to write a user-friendly layer on top. ### Prerequisites -The focus of this chapter is on base R data structures, so you it isn't essential to load any packages. However, the __purrr__ package, which you'll learn more about in [iteration], provides some useful tools to help us see what's going on. +The focus of this chapter is on base R data structures, so it isn't essential to load any packages. We will, however, use a handful of functions from the __purrr__ package to avoid some inconsistences in base R. ```{r} library(purrr) ``` -## Vector overview +## Vector basics There are two types of vectors: -1. __Atomic__ vectors, which are further broken down into six types: +1. __Atomic__ vectors, of which there are six types: __logical__, __integer__, __double__, __character__, __complex__, and __raw__. Integer and double vectors are collectively known as __numeric__ vectors. -1. __Lists__, sometimes called recursive vectors, because lists can - contain other lists. This is the chief difference between atomic vectors - and lists: atomic vectors are homogeneous, lists can be heterogeneous. +1. __Lists__, which are sometimes called recursive vectors because lists can + contain other lists. -There's a somewhat related object: `NULL`. `NULL` is often used to represent the absence of a vector (as opposed to `NA` which is used to represent the absence of a value in a vector). `NULL` typically behaves like a vector of length 0. +The chief difference between atomic vectors is that atomic vectors are __homogeneous__, while lists can be __heterogeneous__. There's one other related object: `NULL`. `NULL` is often used to represent the absence of a vector (as opposed to `NA` which is used to represent the absence of a value in a vector). `NULL` typically behaves like a vector of length 0. Figure \@ref{fig-datatypes} summarises the interrelationships. -The structure of the vector types is summarised in the following diagram: - -```{r, echo = FALSE} +```{r datatypes, echo = FALSE, out.width = "50%", fig.cap = "The hierarchy of R's vector types"} knitr::include_graphics("diagrams/data-structures-overview.png") ``` @@ -53,11 +67,11 @@ Every vector has two key properties: Vectors can also contain arbitrary additional metadata in the form of attributes. These attributes are used to create __augmented vectors__ which build on additional behaviour. There are four important types of augmented vector: -* Factors and dates are built on top of integer vectors. -* Date-times (POSIXct) are built on of double vectors. +* Factors are built on top of integer vectors. +* Dates and date-times are built on of numeric vectors. * Data frames and tibbles are built on top of lists. -This chapter will introduce you to these important vectors from simplest to most complicated. You'll start with atomic vectors, then build up to lists, and finally learn about augmented vectors. +This chapter will introduce you to these important vectors from simplest to most complicated. You'll start with atomic vectors, then build up to lists, and finish off with augmented vectors. ## Important types of atomic vector @@ -68,6 +82,8 @@ The four most important types of atomic vector are logical, integer, double, and Logical vectors are the simplest type of atomic vector because they can take only three possible values: `FALSE`, `TRUE`, and `NA`. Logical vectors are usually constructed with comparison operators, as described in [comparisons]. You can also create them by hand with `c()`: ```{r} +1:10 %% 3 + c(TRUE, TRUE, FALSE, NA) ``` @@ -81,53 +97,47 @@ typeof(1L) 1.5L ``` -The distinction between integers and doubles is not usually important. However, there are two important differences that you need to be aware of: +The distinction between integers and doubles is not usually important, but there are two important differences that you should be aware of: -1. Doubles are approximations. +1. Doubles are approximations. Doubles represent floating point numbers that + can not always be precisely represented with a fixed amount of memory. + This means that you should consider all doubles to be approximations. + For example, what is square of the square root of two? -1. Integers have one special value: `NA_integer_`, while doubles have four: - `NA_real_`, `NaN`, `Inf` and `-Inf` + ```{r} + x <- sqrt(2) ^ 2 + x + x - 2 + ``` -Doubles represent floating point numbers that can not always be precisely represented with a fixed amount of memory. This means that you should consider all doubles to be approximations. For example, what is square of the square root of two? + This behaviour is common when working with floating point numbers: most + calculations include some approximation error. Instead of comparing floating + point numbers using `==`, you should use `dplyr::near()` which allows for + some numerical tolerance. -```{r} -x <- sqrt(2) ^ 2 -x -``` +1. Integers have one special value: `NA`, while doubles have four: + `NA`, `NaN`, `Inf` and `-Inf`. All three special values can arise in + during division: + + ```{r} + c(-1, 0, 1) / 0 + ``` -It certainly looks like R calculates the number we expect: 2. But things are not exactly as they seem: - -```{r} -x == 2 -x - 2 -``` - -This behaviour is common when working with floating point numbers: most calculations include some approximation error. Instead of comparing floating point numbers using `==`, you should use `dplyr::near()` which allows for some numerical tolerance. - -```{r} -dplyr::near(x, 2) -``` - -Doubles have three special values in addition to `NA`: - -```{r} -c(NA, -1, 0, 1) / 0 -``` - -Avoid using `==` to check for these other special values. Instead use the helper functions `is.finite()`, `is.infinite()`, and `is.nan()`: - -| | 0 | Inf | NA | NaN | -|------------------|-----|-----|-----|-----| -| `is.finite()` | x | | | | -| `is.infinite()` | | x | | | -| `is.na()` | | | x | x | -| `is.nan()` | | | | x | + Avoid using `==` to check for these other special values. Instead use the + helper functions `is.finite()`, `is.infinite()`, and `is.nan()`: + + | | 0 | Inf | NA | NaN | + |------------------|-----|-----|-----|-----| + | `is.finite()` | x | | | | + | `is.infinite()` | | x | | | + | `is.na()` | | | x | x | + | `is.nan()` | | | | x | ### Character -Character vectors are the most complex type of atomic vector, because each element of a character vector is a string, and a string can contain an arbitrary amount of data. You've already learned a lot about working with strings in [strings]. +Character vectors are the most complex type of atomic vector, because each element of a character vector is a string, and a string can contain an arbitrary amount of data. -Here I wanted to mention one important feature of the underlying string implementation: R uses a global string pool. This means that each unique string is only stored in memory once, and every use of the string points to that representation. This reduces the amount of memory needed by duplicated strings. You can see this behaviour in practice with `pryr::object_size()`: +You've already learned a lot about working with strings in [strings]. Here I wanted to mention one important feature of the underlying string implementation: R uses a global string pool. This means that each unique string is only stored in memory once, and every use of the string points to that representation. This reduces the amount of memory needed by duplicated strings. You can see this behaviour in practice with `pryr::object_size()`: ```{r} x <- "This is a reasonably long string." @@ -141,7 +151,7 @@ pryr::object_size(y) ### Missing values -Each type of atomic vector has its own missing value: +Note that each type of atomic vector has its own missing value: ```{r} NA # logical @@ -150,7 +160,7 @@ NA_real_ # double NA_character_ # character ``` -Normally, you don't need to know about these different types because you can always use `NA` and it will be converted to the correct type. However, there are some functions that are strict about their inputs, so it's useful to have this knowledge sitting in your back pocket so you can be specific when needed. +Normally you don't need to know about these different types because you can always use `NA` and it will be converted to the correct type using the implicit coercion rules described next. However, there are some functions that are strict about their inputs, so it's useful to have this knowledge sitting in your back pocket so you can be specific when needed. ### Exercises @@ -166,23 +176,22 @@ Normally, you don't need to know about these different types because you can alw integer. How do they differ? Be precise. 1. What functions from the readr package allow you to turn a string - into a logical, integer, or double vector? + into logical, integer, and double vector? ## Using atomic vectors Now that you understand the different types of atomic vector, it's useful to review some of the important tools for working with them. These include: -1. The implicit coercion rules which govern what happen when, for example, - you use a logical vector in a numeric context. +1. How to convert from one type to another, and when that happens + automatically. -1. Tools to test if an function input is a specific type of vector. +1. How to tell if an object is a specific type of vector. -1. R's recycling rules which govern what happens when you work - with vectors of different lengths. +1. What happens when you work with vectors of different lengths. -1. Naming the elements of a vector. +1. How to name the elements of a vector. -1. Subsetting a vector to pull out elements of interest. +1. How pull out elements of interest. ### Coercion @@ -200,9 +209,9 @@ There are two ways to convert, or coerce, one type of vector to another: vector with a numeric summary function, or when you use a double vector where an integer vector is expected. -Because explicit coercion is used relatively rarely (and is largely easy to understand), it's more important to understand implicit coercion. +Because explicit coercion is used relatively rarely, and is largely easy to understand, I'll focus on implicit coercion here. -The most important type of implicit coercion is using a logical vector in a numeric context. In this case `TRUE` is converted to `1` and `FALSE` converted to 0. That means the sum of a logical vector is the number of trues, and the mean of a logical vector is the proportion of trues: +You've already seen the most important type of implicit coercion: using a logical vector in a numeric context. In this case `TRUE` is converted to `1` and `FALSE` converted to 0. That means the sum of a logical vector is the number of trues, and the mean of a logical vector is the proportion of trues: ```{r} x <- sample(20, 100, replace = TRUE) @@ -211,7 +220,7 @@ sum(y) # how many are greater than 10? mean(y) # what proportion are greater than 10? ``` -You may see some code (typically older) that relies on the implicit coercion in the opposite direction, from integer to logical: +You may see some code (typically older) that relies on implicit coercion in the opposite direction, from integer to logical: ```{r, eval = FALSE} if (length(x)) { @@ -229,13 +238,11 @@ typeof(c(1L, 1.5)) typeof(c(1.5, "a")) ``` -An atomic vector can not have a mix of different types because the type is a property of the complete vector, not of the individual elements. If you need to mix multiple types in the same vector, you should use a list, which you'll learn about shortly. +An atomic vector can not have a mix of different types because the type is a property of the complete vector, not the individual elements. If you need to mix multiple types in the same vector, you should use a list, which you'll learn about shortly. ### Test functions -Sometimes you want to do different things based on the type of vector. One option is to use `typeof()`. Another is to use a test function which returns a `TRUE` or `FALSE` (broadly, functions that return a single logical value are often called __predicate__ functions). - -Base R provides many functions like `is.vector()` and `is.atomic()`, but they often returns surprising results. Instead, it's safer to use the `is_*` functions provided by purrr, which are summarised in the table below. +Sometimes you want to do different things based on the type of vector. One option is to use `typeof()`. Another is to use a test function which returns a `TRUE` or `FALSE`. Base R provides many functions like `is.vector()` and `is.atomic()`, but they often returns surprising results. Instead, it's safer to use the `is_*` functions provided by purrr, which are summarised in the table below. | | lgl | int | dbl | chr | list | |------------------|-----|-----|-----|-----|------| @@ -248,11 +255,11 @@ Base R provides many functions like `is.vector()` and `is.atomic()`, but they of | `is_list()` | | | | | x | | `is_vector()` | x | x | x | x | x | -Each predicate also comes with a "scalar" version, which checks that the length is 1. This is useful if you want to check (for example) that the inputs to your function are as you expect. +Each predicate also comes with a "scalar" version, like `is_scalar_atomic()`, which checks that the length is 1. This is useful, for example, if you want to check that an argument to your function is a single logical value. ### Scalars and recycling rules -As well as implicitly coercion the types of vectors to be compatible, R will also implicit coerce the length of vectors. This is called vector "recycling", because the shorter vector is repeated, or __recycled__, to be the same length as the longer vector. +As well as implicitly coercing the types of vectors to be compatible, R will also implicitly coerce the length of vectors. This is called vector __recycling__, because the shorter vector is repeated, or recycled, to the same length as the longer vector. This is generally most useful when you are mixing vectors and "scalars". I put scalars in quotes because R doesn't actually have scalars: instead, a single number is a vector of length 1. Because there are no scalars, most built-in functions are __vectorised__, meaning that they will operate on a vector of numbers. That's why, for example, this code works: @@ -261,7 +268,7 @@ sample(10) + 100 runif(10) > 0.5 ``` -In R, basic mathematical operations work with vectors, not scalars like in most programming languages. This means that you should never need to perform explicit iteration when performing simple mathematical computations. +In R, basic mathematical operations work with vectors. That means that you should never need to perform explicit iteration when performing simple mathematical computations. It's intuitive what should happen if you add two vectors of the same length, or a vector and a "scalar", but what happens if you add two vectors of different lengths? @@ -269,16 +276,20 @@ It's intuitive what should happen if you add two vectors of the same length, or 1:10 + 1:2 ``` -Here, R will expand the shortest vector to the same length as the longest, so called __recycling__. This is silent except in the case where the length of the longer is not an integer multiple of the length of the longer: +Here, R will expand the shortest vector to the same length as the longest, so called recycling. This is silent except when the length of the longer is not an integer multiple of the length of the shorter: ```{r} 1:10 + 1:3 ``` -While vector recycling can be used to create very succinct, clever code, it can also silently conceal problems. For this reason, the vectorised functions in tidyverse will throw errors when you recycle anything other than a scalar. +While vector recycling can be used to create very succinct, clever code, it can also silently conceal problems. For this reason, the vectorised functions in tidyverse will throw errors when you recycle anything other than a scalar. If you do want to recycle, you'll need to do it yourself with `rep()`: ```{r, error = TRUE} tibble::tibble(x = 1:4, y = 1:2) + +tibble::tibble(x = 1:4, y = rep(1:2, 2)) + +tibble::tibble(x = 1:4, y = rep(1:2, each = 2)) ``` ### Naming vectors @@ -299,7 +310,7 @@ Named vectors are most useful for subsetting, described next. ### Subsetting {#vector-subsetting} -So far we've used `dplyr::filter()` to filter the rows in a data frame. `filter()`, however, does not work with vectors, so we need to learn a new tool: `[`. `[` is the subsetting function, and is called like `x[a]`. There are four types of thing that you can subset a vector with: +So far we've used `dplyr::filter()` to filter the rows in a tibble. `filter()` only works with tibble, so we'll need new tool for vectors: `[`. `[` is the subsetting function, and is called like `x[a]`. There are four types of thing that you can subset a vector with: 1. A numeric vector containing only integers. The integers must either be all positive, all negative, or zero. @@ -336,12 +347,12 @@ So far we've used `dplyr::filter()` to filter the rows in a data frame. `filter( x[0] ``` - This is not generally useful, but can be helpful if you want to create - unusual data structures with which to test your functions. + This is not useful very often, but it can be helpful if you want to create + unusual data structures to test your functions with. 1. Subsetting with a logical vector keeps all values corresponding to a - `TRUE` value. This is most often useful in conjunction with a function - that creates a logical vector. + `TRUE` value. This is most often useful in conjunction with the + comparison functions. ```{r} x <- c(10, 3, NA, 5, 8, 1, NA) @@ -371,15 +382,20 @@ So far we've used `dplyr::filter()` to filter the rows in a data frame. `filter( all the columns, and `x[, -1]` selects all rows and all columns except the first. -I'd recommend reading to learn more about how you can use subsetting to achieve various goals. If you are working with data frames, you can typically use a dplyr function to achieve these goals, but the techniques are useful to know about when you are writing your own functions. +To learn more about the applications of subseting, reading the "Subsetting" chapter of _Advanced R_: . -There is an important variation of `[` called `[[`. `[[` only ever extracts a single element, and always drops names. It's a good idea to use it whenever you want to make it clear that you're extracting one thing, as in a for loop. The distinction between `[` and `[[` is most important for lists, as we'll see shortly. +There is an important variation of `[` called `[[`. `[[` only ever extracts a single element, and always drops names. It's a good idea to use it whenever you want to make it clear that you're extracting a single item, as in a for loop. The distinction between `[` and `[[` is most important for lists, as we'll see shortly. ### Exercises +1. What does `mean(is.na(x))` tell you about a vector `x`? What about + `sum(!is.finite(x))`? + 1. Carefully read the documentation of `is.vector()`. What does it actually test for? Why does `is.atomic()` not agree with the definition of atomic vectors above? + +1. Compare and contrast `setNames()` with `purrr::set_names()`. 1. Create functions that take a vector as input and returns: @@ -490,15 +506,15 @@ a <- list(a = 1:3, b = "a string", c = pi, d = list(-1, -5)) a[["a"]] ``` -The distinction between `[` and `[[` is really important for lists, because `[[` drills down into the list while `[` returns a new, smaller list. Compare the code and output above with the visual representation below. +The distinction between `[` and `[[` is really important for lists, because `[[` drills down into the list while `[` returns a new, smaller list. Compare the code and output above with the visual representation in Figure \@ref(fig:lists-subsetting). -```{r, echo = FALSE, out.width = "75%"} +```{r lists-subsetting, echo = FALSE, out.width = "75%", fig.cap = "Subsetting a list, visually."} knitr::include_graphics("diagrams/lists-subsetting.png") ``` ### Lists of condiments -The difference between `[` and `[[` is very important, but it's easy to get confused. A few months ago I stayed at a hotel with a rather interesting pepper shaker that I hope will help you remember these differences: +The difference between `[` and `[[` is very important, but it's easy to get confused. To help you remember, let me show you an unusual pepper shaker. ```{r, echo = FALSE, out.width = "25%"} knitr::include_graphics("images/pepper.jpg") @@ -531,12 +547,13 @@ knitr::include_graphics("images/pepper-3.jpg") 1. `list(a, b, list(c, d), list(e, f))` 1. `list(list(list(list(list(list(a))))))` -1. What happens if you subset a data frame as if you're subsetting a list? - What are the key differences between a list and a data frame? +1. What happens if you subset a tibble as if you're subsetting a list? + What are the key differences between a list and a tibble? ## Attributes -Any vector can contain arbitrary additional metadata through its __attributes__. You can think of attributes as named list of vectors that can be attached to any object. You can get and set individual attribute values with `attr()` or see them all at once with `attributes()`. +Any vector can contain arbitrary additional metadata through its __attributes__. You can think of attributes as named list of vectors that can be attached to any object. +You can get and set individual attribute values with `attr()` or see them all at once with `attributes()`. ```{r} x <- 1:10 @@ -552,7 +569,7 @@ There are three very important attributes that are used to implement fundamental 1. __Dimensions__ (dims, for short) make a vector behave like a matrix or array. 1. __Class__ is used to implement the S3 object oriented system. -You've seen names above, and we won't cover dimensions because we don't use matrices in this book. It remains to describe the class, which controls how __generic functions work__. Generic functions are key to object oriented programming in R, making different types of vector act differently. A detailed discussion of the S3 object oriented system is beyond the scope of this book, but you can read more about it at . +You've seen names above, and we won't cover dimensions because we don't use matrices in this book. It remains to describe the class, which controls how __generic functions__ work. Generic functions are key to object oriented programming in R, because they make functions behave differently for different classes of input. A detailed discussion of object oriented programming is beyond the scope of this book, but you can read more about it _Advanced R_ at . Here's what a typical generic function looks like: @@ -579,7 +596,7 @@ The most important S3 generic is `print()`: it controls how the object is printe ## Augmented vectors -Atomic vectors and lists are the building blocks for other important vector types like factors and dates. I call these __augmented vectors__, because they are vectors with additional __attributes__. Generic methods make augmented vectors behave differently, depending on their class. In this book, we make use of four important augmented vectors: +Atomic vectors and lists are the building blocks for other important vector types like factors and dates. I call these __augmented vectors__, because they are vectors with additional __attributes__, including class. Because augmented vectors has a class, they behave differently to the atomic vector on which they are built. In this book, we make use of four important augmented vectors: * Factors. * Date-times and times. @@ -597,18 +614,9 @@ typeof(x) attributes(x) ``` -You can create them from scratch with `factor()` or from a character vector with `as.factor()`. - -```{r} -x <- factor(letters[1:5]) -is.factor(x) -as.factor(letters[1:5]) -``` - - ### Dates and date-times -Dates in R are numeric vectors (sometimes integers, sometimes doubles) that represent the number of days since 1 January 1970. +Dates in R are numeric vectors that represent the number of days since 1 January 1970. ```{r} x <- as.Date("1971-01-01") @@ -618,7 +626,7 @@ typeof(x) attributes(x) ``` -Date-times are numeric vectors (sometimes integers, sometimes doubles) that represent the number of seconds since 1 January 1970: +Date-times are numeric vectors with class `POSIXct` that represent the number of seconds since 1 January 1970. (In case you were wondering, "POSIXct" stands for "Portable Operating System Interface", calendar time.) ```{r} x <- lubridate::ymd_hm("1970-01-01 01:00") @@ -628,7 +636,7 @@ typeof(x) attributes(x) ``` -The `tzone` is optional. It controls how the time is printed, not what absolute time it refers to. +The `tzone` attribute is optional. It controls how the time is printed, not what absolute time it refers to. ```{r} attr(x, "tzone") <- "US/Pacific" @@ -646,7 +654,7 @@ typeof(y) attributes(y) ``` -POSIXlts are rare inside the tidyverse. They do crop up in base R, because they are needed to extract specific components of a date (like the year or month). Since lubridate provides helpers for you to do this instead, you don't need them. POSIXct's are always easier to work with, so if you find you have a POSIXlt, you should always convert it to a POSIXct with `as.POSIXct()`. +POSIXlts are rare inside the tidyverse. They do crop up in base R, because they are needed to extract specific components of a date, like the year or month. Since lubridate provides helpers for you to do this instead, you don't need them. POSIXct's are always easier to work with, so if you find you have a POSIXlt, you should always convert it to a regular data time `lubridate::as_date_time()`. ### Tibbles @@ -658,7 +666,7 @@ typeof(tb) attributes(tb) ``` -The difference between a tibble and a list is that all the elements of a data frame must be the same length. All functions that work with tibbles enforce this constraint. +The difference between a tibble and a list is that all the elements of a data frame must be vectors with the same length. All functions that work with tibbles enforce this constraint. Traditional data.frames have a very similar structure: @@ -678,3 +686,6 @@ The main difference is the class. The class of tibble includes "data.frame" whic 1. Try and make a tibble that has columns with different lengths. What happens? + +1. Based of the definition above, is it ok to have a list as a + column of a tibble?