Chapter 2 R Programming Done Wrong
The motivation behind this chapter is to provide a reference guide to the more common mistakes when writing R code.
2.1 Beginners Luck
2.1.1 Checking for Equality vs. Assignment
The most common error by far that affects programmers is making an assignment when trying to check for equality (and vice versa)
# Assigning in `if`
if(x = 42) { cat("Life!") }
## Error: unexpected '=' in "if(x ="
# Correct
if(x == 42) { cat("Life!") }
# Equality Check instead of Assignment
x == 42
## No Error, but prints `TRUE` or `FALSE`
# Correct
x = 42
2.1.2 Missing object
x
Error: object 'x' not found
# Correct
x = 1
x
2.1.3 if
vectorization usage
As emphasis on vectorization grows, there is a tendency to compare two vectors
using the default if()
instead of ifelse()
x = 1:5
y = 2:6
if(x > y) { TRUE } else { FALSE }
## Warning messages:
## In if (x > y) { : the condition has length > 1 and only the first element will be used
# Correct, if element-wise comparison required
ifelse(x > y, TRUE, FALSE)
# Correct, if totality-comparison requested
if(all(x > y)) { TRUE } else { FALSE }
2.1.4 Vector Recycling
Sometimes the length of vectors are not equal or the data does not divide evenly or oddly when perform a vectorized computation.
x = 1:5
y = 2:3
x + y
## Warning message:
## In x + y : longer object length is not a multiple
## of shorter object length
# Correct
x = 1:4
y = 2:3
x + y
# Repeats y twice
# 1 + 2, 2 + 3, 3 + 2, 4 + 3
2.2 Omitting Symbols
2.2.1 Mismatched curly brackets {}
, parentheses ()
, or brackets []
Often it is ideal to use parentheses or curly
brackets for order of operations, though this sometimes causes a mismatch. A
mismatch may also be present with the brackets subset operator []
2*(x + y))
## Error: unexpected ')' in "2*(x + y))"
2*{x + y}}
## Error: unexpected '}' in "2*{x + y}}"
x]1
## Error: unexpected ']' in "x]"
# Corrected
2*((x + y))
2*{{x + y}}
x[1]
2.2.2 No Multiplication Symbol
When working on computations, sometimes we just “slip” and opt not to write a multiplication sign thinking the interpreter can understand the context.
2x+4
## Error: unexpected symbol in "2x"
# Correct
2*x + 4
2.2.3 Manual Data Entry
Sometimes it’s easier as we’ll see next week to manually enter data.
The issue with this is sometimes you forget simple things like a ,
.
c(1, 2 3, 4)
## Error: unexpected numeric constant in "c(1,2 3"
# Correct
c(1, 2, 3, 4)
2.2.4 Strings in character values
At times, there may come a need to place a quotation inside of a string. To do
this, requires using an escape character \
or using ''
instead.
"toad"princess"
## Error: unexpected symbol in ""toad"princess"
# Corrected
"toad\"princess"
'toad"princess'
2.3 Special Values
2.3.1 Handling Missing Value Operations
The NA
character indicates the presence of a missing value.
These missing values can play havoc with computations.
x = c(1,NA,2)
3 + x
# No Error, but: [1] 4 NA 5
sum(x)
# No Error, but: [1] NA
# Corrected
1 + na.omit(x) # Deletes NA
sum(x, na.rm = T) # Removes NA inside function
2.3.2 Finiteness of Values
R can have some funky finiteness problems due to how NA
values are created.
x = c(NA,-Inf, Inf ,NaN)
is.na(x)
# No error, but: [1] TRUE FALSE FALSE TRUE
is.infinite(x)
# No error, but: [1] FALSE TRUE TRUE FALSE
# Correct
is.finite(x)
# [1] FALSE FALSE FALSE FALSE