The difference between "letters[c(1,NA)]" and "letters[c(NA,NA)]"

In David Smith’s latest blog post (which, in a sense, is a continued response to the latest public attack on R), there was a comment by Barry that caught my eye. Barry wrote:

Even I get caught out on R quirks after 20 years of using it. Compare letters[c(12,NA)] and letters[c(NA,NA)] for the most recent thing that made me bang my head against the wall.

So I did, and here’s the output:

> letters[c(12,NA)]
[1] "l" NA
>  letters[c(NA,NA)]
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
>

Interesting isn’t it?
I had no clue why this had happened but luckily for us, Barry gave a follow-up reply with an explanation. And here is what he wrote:

My example with ‘letters’ comes from a collision of three features:

  1. recycling of short subscripts
  2. silent coercion of types (boolean NA to numeric NA)
  3. and the existence of five different NA values that all print the same.

[…] to really understand that letters[c(1,NA)] is different from letters[c(NA,NA)] you have to see that:

  • in the first case, the NA is coerced to a numeric NA because it’s in a vector with a numeric ‘1’.
  • in the first case, you are selecting elements by supplying a vector of indexes
  • in the second case, your NAs are boolean (logical) NA values
  • hence your subscript is a logical vector
  • logical vectors are recycled
  • now your subscript is a vector of TRUE/FALSE values (which are all NA) of the same length as ‘letters’.

To make sure I understood Barry correctly, I tried the following code:

>  letters[c(T,NA)]
 [1] "a" NA  "c" NA  "e" NA  "g" NA  "i" NA  "k" NA  "m" NA  "o" NA  "q" NA  "s" NA  "u" NA  "w" NA  "y" NA
Barry gave this example to illustrate how R violates the Zen idea if: “Simple is better than complex”. ┬áSince (so he claims), subscript recycling is shooting you in the foot.
To follow up on that discussion, head over to Barry’s comment on the REvolution blog

0 thoughts on “The difference between "letters[c(1,NA)]" and "letters[c(NA,NA)]"”

Leave a Reply