The Best R Packages in 2026: A Curated List
The R package ecosystem continues to evolve rapidly. With thousands of packages on CRAN, knowing which ones to focus on can feel overwhelming. This guide cuts through the noise and highlights the packages that truly matter in 2026.
Whether you are new to R or a seasoned developer, these packages form the foundation of modern R programming.
Data Manipulation
tidyverse
The tidyverse remains the undisputed king of data manipulation in R. This collection of packages sharing a common philosophy has transformed how R developers work with data.
install.packages("tidyverse")
library(tidyverse)
# The core tidyverse includes:
# - ggplot2 (visualization)
# - dplyr (data manipulation)
# - tidyr (data tidying)
# - readr (data import)
# - purrr (functional programming)
# - tibble (tibbles)
# - stringr (strings)
# - forcats (factors)
# Example workflow
mtcars %>%
filter(cyl == 4) %>%
mutate(kwhp = hp / 100) %>%
arrange(desc(kwhp)) %>%
select(mpg, hp, kwhp)
data.table
For those dealing with massive datasets, data.table remains the performance champion:
install.packages("data.table")
library(data.table)
dt <- as.data.table(mtcars)
dt[cyl == 4, .(mpg, hp)][order(-mpg)]
The syntax is more compact than tidyverse and can be 10-100x faster on large data.
arrow and duckdb
Modern data work often spans multiple formats. Arrow provides cross-language data columns:
install.packages("arrow")
library(arrow)
# Read Parquet files directly without loading into memory
dt <- read_parquet("large_file.parquet")
DuckDB brings SQL to R for analytical queries:
install.packages("duckdb")
library(DBI)
con <- dbConnect(duckdb::duckdb())
Visualization
ggplot2
The grammar of graphics has become the standard for data visualization:
library(ggplot2)
ggplot(mtcars, aes(mpg, hp, color = factor(cyl))) +
geom_point(size = 3) +
labs(title = "Cars: HP vs MPG",
subtitle = "By cylinder count") +
theme_minimal()
plotly
For interactive visualizations, plotly transforms ggplot2 objects:
install.packages("plotly")
library(plotly)
ggplotly(
ggplot(mtcars, aes(mpg, hp, color = factor(cyl))) +
geom_point()
)
Statistical Modeling
tidymodels
The tidymodels framework brings consistent modeling syntax:
install.packages("tidymodels")
library(tidymodels)
# Define a model
lm_spec <- linear_reg() %>%
set_engine("lm")
# Fit
lm_fit <- lm_spec %>%
fit(mpg ~ hp + wt, data = mtcars)
# Extract
tidy(lm_fit)
parsnip
Part of tidymodels, parsnip provides a unified interface across algorithms:
# Same syntax for different engines
log_spec <- logistic_reg() %>% set_engine("glm")
rf_spec <- rand_forest() %>% set_engine("ranger")
Machine Learning
caret
Despite newer alternatives, caret still serves as a unified interface for 200+ ML algorithms:
install.packages("caret")
library(caret)
model <- train(Species ~ ., data = iris, method = "rf")
xgboost and lightgbm
Gradient boosting dominates ML competitions:
install.packages("xgboost")
library(xgboost)
dtrain <- xgb.DMatrix(data = as.matrix(mtcars[, -1]), label = mtcars$mpg)
model <- xgb.train(params = list(objective = "reg:squarederror"), dtrain)
ranger and randomForest
For random forests, ranger provides speed:
install.packages("ranger")
library(ranger)
rf <- ranger(Species ~ ., data = iris, num.trees = 100)
Reporting and Documents
Quarto
Quarto has largely replaced R Markdown for publishing:
install.packages("quarto")
# Or use the CLI: quarto install
Create .qmd files that render to HTML, PDF, Word, and more.
rmarkdown
Still useful for traditional R Markdown workflows:
install.packages("rmarkdown")
library(rmarkdown)
render("report.Rmd")
gt and gtExtras
For publication-ready tables:
install.packages("gt")
library(gt)
mtcars %>%
head() %>%
gt() %>%
tab_header(title = "Motor Trend Cars")
Web and APIs
httr2
Modern HTTP requests:
install.packages("httr2")
library(httr2)
req <- request("https://api.example.com") %>%
req_headers(Authorization = "Bearer token") %>%
req_perform()
plumber
Build REST APIs directly from R:
library(plumber)
#* @get /hello
function(name = "World") {
list(greeting = paste0("Hello, ", name))
}
rvest
Web scraping made easy:
install.packages("rvest")
library(rvest)
page <- read_html("https://example.com")
html_elements(page, "a") %>% html_text()
Development Tools
devtools
Package development simplified:
install.packages("devtools")
library(devtools)
load_all(".")
check()
build()
testthat
Writing tests is essential:
install.packages("testthat")
library(testthat)
test_that("multiplication works", {
expect_equal(2 * 2, 4)
})
renv
Reproducible environments:
install.packages("renv")
library(renv)
renv::init()
renv::snapshot()
Specialization Packages
lubridate
Date and time handling:
install.packages("lubridate")
library(lubridate)
ymd("2026-01-15") + weeks(2)
stringr
String manipulation:
library(stringr)
str_detect("hello world", "hello")
str_replace_all("hello", "l", "r")
forcats
Factor handling:
library(forcats)
fct_reorder(f, n) %>%
fct_lump_n(10)
The Rising Stars
Several packages are gaining momentum in 2026:
polars
The Polars library coming to R offers blazing speed:
install.packages("polars")
library(polars)
targets
Reproducible computational pipelines:
install.packages("targets")
library(targets)
vctrs
Foundation for vector operations, increasingly important for package development.
See Also
- Introduction to the Tidyverse — Getting started with tidy data
- Data Manipulation with dplyr — Core data wrangling verbs
- Building and Publishing an R Package — Package development guide