R Variables and Data Types
A variable in R is a named container that stores a value in memory, created with the assignment operator <- (read as 'gets'), for example age <- 25. R also accepts = for assignment at the top level, but the R community style guide (and packages like tidyverse's style guide) strongly prefers <- because = is reserved for naming arguments inside function calls, and mixing the two can cause subtle confusion in nested code.
Cricket analogy: Naming a variable with <- is like a scorer writing 'Kohli's score is now 47' on the board — the arrow direction makes clear which way the value flows, the same way a scoreboard update clearly assigns a number to a named player.
The Atomic Vector Types
R has six atomic (indivisible) vector types, but beginners work mainly with four: numeric (double-precision decimals like 3.14), integer (whole numbers, written with an L suffix like 5L to force integer storage), character (text strings in quotes like "Bengaluru"), and logical (TRUE or FALSE, which R also accepts abbreviated as T and F, though the full words are safer since T and F can be reassigned as ordinary variable names). Every element in a single R vector must share the same type — c(1, 2, "three") silently converts all elements to character, which is a frequent source of bugs for beginners.
Cricket analogy: It's like a scorecard column that must hold only run totals, not a mix of run totals and player names — mixing numeric and character in one R vector is like writing 'Kohli' into the runs column, forcing everything to become text.
Special Values: NA, NULL, NaN, and Inf
R distinguishes several special values that beginners often confuse: NA represents a missing or unavailable value within a vector (for example, an unanswered survey question), NULL represents the complete absence of a value or an empty object (a vector of length zero), NaN ('Not a Number') results from mathematically undefined operations like 0/0, and Inf/-Inf represent positive/negative infinity from operations like 1/0. Functions like is.na(), is.null(), and is.nan() let you test for these explicitly, and critically, most aggregate functions like mean() and sum() return NA by default if any element is NA unless you pass na.rm = TRUE.
Cricket analogy: NA is like a 'DNB' (Did Not Bat) entry on a scorecard — the batter exists but has no recorded score, whereas NULL is like a player never being named in the squad at all, and mean(runs) without na.rm = TRUE fails the same way an average breaks if DNB entries aren't excluded.
Checking and Converting Types
You can inspect any object's type with class() (the object's high-level class, like 'numeric' or 'character') or typeof() (R's lower-level internal storage type, like 'double' or 'integer'), and you can test for a specific type with functions like is.numeric(), is.character(), and is.logical(). To deliberately convert between types, use as.numeric(), as.character(), as.integer(), or as.logical() — for example as.numeric("42") returns 42, but as.numeric("forty-two") returns NA with a warning, because R cannot parse a non-numeric string into a number.
Cricket analogy: class() is like checking a player's official role on the team sheet (batter, bowler, all-rounder), while as.numeric() is like converting a player's informal nickname into their official jersey number — it works for clean data like "18" but fails for something like "eighteen".
# Assignment and atomic types
age <- 25L # integer
price <- 19.99 # numeric (double)
city <- "Bengaluru" # character
is_open <- TRUE # logical
class(age) # "integer"
typeof(price) # "double"
# Type coercion pitfalls
mixed <- c(1, 2, "three")
class(mixed) # "character" -- everything got coerced!
# Handling NA properly
scores <- c(88, 92, NA, 76)
mean(scores) # NA
mean(scores, na.rm = TRUE) # 85.33333
is.na(scores) # FALSE FALSE TRUE FALSE
# Explicit conversion
as.numeric("42") # 42
as.numeric("forty-two") # NA, with a warningThe tidyverse style guide (used by RStudio and most modern R teams) recommends <- for assignment and reserves = strictly for passing named arguments inside function calls, e.g. round(x, digits = 2). Following this convention makes code easier to read for anyone familiar with the broader R community.
Combining mixed types with c() does not raise an error — it silently coerces every element to the 'widest' common type (logical → integer → numeric → character). c(1, TRUE, "3") becomes c("1", "TRUE", "3"), a character vector, which can cause quiet, hard-to-spot bugs downstream in calculations.
- Create variables with <- (preferred) or = at the top level; <- avoids ambiguity with named function arguments.
- The four beginner-facing atomic types are numeric, integer (with an L suffix), character, and logical.
- Every element within a single vector must share one type; mixing types triggers silent coercion.
- NA means a missing value within a vector; NULL means the complete absence of a value or object.
- NaN comes from undefined math like 0/0; Inf/-Inf come from operations like 1/0.
- Use class()/typeof() to inspect types and is.*() functions to test for a specific type.
- Use as.numeric(), as.character(), etc. for explicit conversion, and check for NA results from failed conversions.
Practice what you learned
1. Which assignment operator does the R community style guide recommend over '='?
2. What happens when you run c(1, 2, "three") in R?
3. What is the difference between NA and NULL in R?
4. What does mean(c(10, 20, NA)) return by default?
5. What does as.numeric("forty-two") return?
Was this page helpful?
You May Also Like
What Is R?
An introduction to R as a statistical programming language: its history, design philosophy, real-world applications, and how it compares to other data tools.
R Operators
A tour of R's arithmetic, relational, logical, and special operators, including vectorized behavior and common pitfalls like && vs &.
Your First R Script
How to write, structure, and run a complete R script covering variables, a custom function, control flow, and output, both inside RStudio and from the command line.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics