1---2name: r3description: Avoid common R mistakes — vectorization traps, NA propagation, factor surprises, and indexing gotchas.4---56## Vectorization7- Loops are slow — use `apply()`, `lapply()`, `sapply()`, or `purrr::map()`8- Vectorized functions operate on whole vectors — `sum(x)` not `for (i in x) total <- total + i`9- `ifelse()` is vectorized — `if` is not, use `ifelse()` for vector conditions10- Column operations faster than row — R is column-major1112## Indexing Gotchas13- R is 1-indexed — first element is `x[1]`, not `x[0]`14- `x[0]` returns empty vector — not error, silent bug15- Negative index excludes — `x[-1]` removes first element16- `[[` extracts single element — `[` returns subset (list stays list)17- `df[, 1]` drops to vector — use `df[, 1, drop = FALSE]` to keep data frame1819## NA Handling20- NA propagates — `1 + NA` is `NA`, `NA == NA` is `NA`21- Use `is.na()` to check — not `x == NA`22- Most functions need `na.rm = TRUE` — `mean(x)` returns NA if any NA present23- `na.omit()` removes rows with any NA — may lose data unexpectedly24- `complete.cases()` returns logical vector — rows without NA2526## Factor Traps27- Old R converted strings to factors by default — use `stringsAsFactors = FALSE` or modern R28- `levels()` shows categories — but factor values are integers internally29- Adding new value not in levels gives NA — use `factor(x, levels = c(old, new))`30- `as.numeric(factor)` gives level indices — use `as.numeric(as.character(factor))` for values31- Dropping unused levels: `droplevels()` — or `factor()` again3233## Recycling34- Shorter vector recycled to match longer — `c(1,2,3) + c(10,20)` gives `11, 22, 13`35- No error if lengths aren't multiples — just warning, easy to miss36- Single values recycle intentionally — `x + 1` adds 1 to all elements3738## Data Frames vs Tibbles39- Tibble never converts strings to factors — safer defaults40- Tibble never drops dimensions — `df[, 1]` stays tibble41- Tibble prints better — shows type, doesn't flood console42- `as_tibble()` to convert — from `tibble` or `dplyr` package4344## Assignment45- `<-` is idiomatic R — `=` works but avoided in style guides46- `<<-` assigns to parent environment — global assignment, usually a mistake47- `->` right assignment exists — rarely used, confusing4849## Scope50- Functions look up in parent environment — can accidentally use global variable51- Local variable shadows global — same name hides outer variable52- `local()` creates isolated scope — variables don't leak out5354## Common Mistakes55- `T` and `F` can be overwritten — use `TRUE` and `FALSE` always56- `1:length(x)` fails on empty x — gives `c(1, 0)`, use `seq_along(x)`57- `sample(5)` vs `sample(c(5))` — different! first gives 1:5 permutation58- String splitting: `strsplit()` returns list — even for single string