100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

R Variables and Data Types

How to create variables in R with the assignment operator, the core atomic data types, special values like NA and NULL, and how type coercion works.

FoundationsBeginner8 min readJul 10, 2026
Analogies

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".

r
# 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 warning

The 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

Was this page helpful?

Topics covered

#Programming#RProgrammingStudyNotes#RVariablesAndDataTypes#Variables#Data#Types#Atomic#StudyNotes#SkillVeris#ExamPrep