R 速查 — 简明参考
R 4.4 语法、数据结构与最常用 base R / tidyverse 速查手册,覆盖约 80% 日常场景。
R R 4.4
R (GNU R / 交互式解释器) · 函数式 · 向量化 · OO (S3 / S4 / R6) · 动态
学习路径
先学会 Rscript 运行与赋值(<-)→ 掌握向量、data.frame 等数据结构 → 用 if/for/apply 家族写流程 → 学会函数、闭包与管道 |> → 深入 apply 集合操作 → 理解 S3/R6 面向对象与错误处理 → 再按需学文件 I/O、并行、网络与正则。FAQ 节适合回头避坑;包管理与 renv 见构建章节。
1.Hello World 与运行环境
Rscript 运行、REPL 交互、打印输出与帮助文档。
最小程序
R 以表达式为单位求值。print 打印对象,cat 直接输出。脚本可用 Rscript 运行。
赋值与输出
赋值用 <- 或 =。print 显示对象结构,cat 适合拼接输出。message 写 stderr。
Rscript 运行
Rscript 以非交互方式运行脚本,适合批处理与命令行。source 在会话内运行脚本文件。
命令行参数
commandArgs(trailingOnly = TRUE) 取脚本后的命令行参数。参数均为字符串。
打印输出
print 显示对象与结构,cat 无引号拼接,sprintf 格式化。invisible 抑制自动打印。
帮助文档
? 打开帮助,?? 全文搜索。args 看函数形参,example 运行示例。
加载包
library 加载包到搜索路径,require 返回逻辑值。:: 显式取包内函数。
运行脚本
source 在当前会话执行脚本文件,可定义函数与变量。echo 显示执行过程。
2.变量与常量
赋值、基本类型、NA/NULL 与类型转换。
赋值符号
<- 是惯用赋值;= 也可。<<- 在函数内写外层变量。全局赋值用 assign。
基本类型
原子向量有 numeric、integer、character、logical。整数用 L 后缀。typeof 看存储类型。
NA 与 NULL
NA 表示缺失值,NULL 表示空对象。is.na / is.null 判断。NaN 是非数值,Inf 无穷。
类型转换
as.* 显式转换。c() 拼接不同类时自动向最通用类型转换。判断用 is.*。
创建向量
c 拼接、冒号生成序列、seq 定制步长、rep 重复。names 给元素命名。
命名约定
变量名允许字母、数字、点、下划线,不能以数字开头。点号在 R 中不是运算符。
变量管理
ls 列出变量,rm 删除。exists 判断存在。rm(list = ls()) 清空环境。
内置常量
R 内置常用常量:pi、letters、month.name,以及 .Machine 平台细节。
作用域基础
R 词法作用域:函数内找变量逐级向外。全局与局部同名会遮蔽。get 指定环境取值。
3.数据类型与结构
向量、因子、矩阵、列表、数据框与 tibble,R 的数据结构体系。
向量
原子向量同质且一维,是 R 最基础结构。c() 创建,索引从 1 开始。
因子
因子存分类变量,levels 固定类别。有序因子表示顺序。as.factor / factor 创建。
矩阵
matrix 二维同质。byrow 控制填充方向。行名/列名与维度名 dimnames。
数组
array 任意维同质结构。dim 指定各维长度。适用多维张量。
列表
list 异构可嵌套。$ 与 [[ 取元素,[ 返回子列表。length 统计元素数。
数据框
data.frame 表格型数据,列可异质。默认 stringsAsFactors=FALSE(R 4.0+)。str/head 查看。
tibble
tibble 是 tidyverse 的现代数据框:惰性计算列、打印友好、不转字符串为因子。
属性
attributes 携带元信息:names、dim、class 等。attr 单独读取/设置。structure 一步构造。
类型判断
is.* 判断类型,class/typeof/mode 看类型。as.* 转换。is.data.frame 等用于分支。
4.引用与对象语义
R 无裸指针:copy-on-modify 值语义与 environment 引用语义。
写时复制
R 采用复制时修改(copy-on-modify):赋值共享数据,仅在被修改时才真正复制。大对象赋别名几乎零成本。
tracemem 追踪拷贝
tracemem 标记对象,R 在真正复制该对象时打印地址变化。用来诊断意外拷贝与内存开销。
环境引用
environment 是 R 中的引用对象:传参给函数不会复制,函数内修改直接生效。相当于 R 的「指针」。
可变状态容器
环境作可变状态容器:计数器、缓存、累加器。避免全局变量污染,状态显式传递。
浅拷贝与深拷贝
列表赋值是浅拷贝:共享子对象,改嵌套元素会复制该层。深拷贝需显式实现。
引用类 R6
R6 是引用语义的类:对象按引用传递,方法修改原对象而非副本。适合状态管理。
data.table 引用
data.table 用 := 原地修改(引用语义),data.frame 是复制语义。setDT 原地转 data.table。
对象大小
object.size 看单个对象占用,gc 看整体内存。lobstr::obj_size 能算共享量。
显式复制
需要独立副本时显式复制:列表用 lapply 递归复制,data.table 用 copy,向量用 []。
5.流程控制
if / else、向量化 ifelse、for / while、switch 与逻辑运算。
if / else
if 条件必须是长度 1。非 1 时取首元素并告警。else 与 if 同行结尾括号一致。
ifelse 向量化
ifelse 对向量逐元素条件判断,返回与条件同长的结果。适合批量替换。
for 循环
for 遍历向量或序列。seq_along 按索引遍历,避免用 1:length 的空序列陷阱。
while 与 repeat
while 先判条件再执行;repeat 无条件循环,靠 break 退出。二者都注意防止死循环。
next 与 break
next 跳到下一轮,break 退出循环。适合跳过与提前终止。
switch
switch 按位置或名字分发。数字取第 n 个,字符匹配命名分支,未匹配返回 NULL。
向量化优于循环
R 用向量化替代显式循环:整向量一次运算,更快更简洁。循环留给不可向量化场景。
逻辑运算
& | 是向量化逻辑运算,&& || 只评估第一个元素(短路)。any/all 汇总。
索引遍历
seq_along / seq_len 生成索引,rev 逆序。which 取位置。split 分组循环。
6.函数与闭包
函数定义、参数、惰性求值、可变参数、闭包与管道。
函数定义
function 定义函数,函数体最后表达式为返回值。匿名函数直接用于参数。
参数与默认值
函数参数可设默认值。调用可省略参数名按位置传,也可命名传参。missing 判断是否提供。
惰性求值
R 参数惰性求值:用到才求值,未用不报错。force 强制提前求值。这在闭包中很关键。
可变参数
... 捕获任意多参数。list(...) 收集,do.call 用列表动态调用函数。
返回值
函数返回最后表达式。return 提前返回。invisible 返回值不自动打印。
闭包
函数捕获创建它的环境,可携带私有状态。工厂函数生成带状态的新函数。
匿名函数
匿名函数即函数字面量,常用于 apply 家族与 purrr。R 4.1+ 支持 \\(x) 简写。
高阶函数
函数可作为参数传给函数,也可返回函数。Map / Reduce / Filter 等内建高阶函数。
管道
|> 原生管道把左侧结果传给右侧函数首参,让嵌套调用变线性。%>% 是 magrittr 版本。
7.字符串
字符向量、拼接、截取、分割、正则与格式化。
字符串基础
字符向量用引号,双引号与单引号等价。nchar 长度,[] 取字符。反斜杠需转义。
拼接
paste 默认空格分隔,paste0 无分隔。collapse 把整个向量合成一个字符串。向量化拼接。
截取
substr / substring 按位置截取,[] 中括号取单个字符。strsplit 分割。
分割
strsplit 按分隔符拆成列表。unlist 拍平。正则也可作分隔。
正则函数
grep / grepl 匹配,gsub / sub 替换。vectorized 全部按元素。详细见正则章节。
格式化
sprintf 仿 C printf 格式化。%s 字符串,%d 整数,%f 浮点。formatC / round 控制数字。
大小写与修剪
toupper / tolower 转换大小写,trimws 去空白。chartr 字符替换。工具名处理常用。
编码处理
R 字符串为 UTF-8 为主。Encoding 查看编码,enc2utf8 转换。iconv 转码。
stringr
tidyverse 字符串处理包。str_ 前缀函数统一命名,str_detect / str_replace / str_extract。
8.集合与 apply 家族
apply / lapply / sapply 批量遍历,排序、去重、集合运算与 dplyr 数据操作。
lapply 与 sapply
lapply 对列表/向量逐元素应用函数并返回列表。sapply 尝试简化成向量或矩阵。
apply
apply 沿矩阵/数组维度批量运算。MARGIN=1 按行、2 按列。返回值按维度拼。
mapply 多参
mapply 并行地对多个参数应用函数,对应 Map。短参数循环补齐。SIMPLIFY 控制简化。
split 分组
split 按因子把向量拆成组列表。配合 lapply 做分组统计,等价 group-by。
排序与排名
sort 排向量,order 返回排序索引,rank 排名。decreasing 控制方向。数据框按列排序。
去重
unique 去重,duplicated 标记重复项。任何重复行取第一个。all.equal 比较向量。
集合运算
union / intersect / setdiff 集合运算。%in% 判断元素存在。unique 后取交并差。
列表操作
组合列表、展平、批量改名。unlist 递归拍平,do.call 拼接为数组。purrr 类型化操作。
dplyr 数据操作
select/filter/mutate/arrange/summarise 管道式操作数据框,group_by 分组。核心 tidyverse。
9.内存管理
垃圾回收、对象大小、拷贝成本、预分配与性能分析。
垃圾回收
R 自动引用计数 + 周期 GC。gc 手动回收并报告。大数据循环后可调用。
对象大小
object.size 看单个对象字节数。format 转可读单位。大数据集需预估内存。
拷贝成本
R 值语义在修改时复制整个对象,大对象修改代价高。避免频繁修改大向量元素。
预分配
先分配好长度的结果向量,再循环填充,避免反复拼接复制。numeric/character 预分配。
向量化与性能
尽量整向量运算。行绑定 rbind 慢,用 do.call(rbind, list) 或 data.table。微基准测试。
内存上限
memory.limit(Windows)查看/调整上限。object.size 检查。ulimit 影响会话。
性能分析
Rprof 记录函数调用耗时。summaryRprof 汇总。system.time 粗略计时。profvis 可视化。
data.table 内存
data.table 用引用语义减少复制::= 原地改、setDT 转换、copy 显式复制。大数据集更省内存。
10.面向对象 (S3 / S4 / R6)
S3 简易泛型、S4 形式化类、R6 引用类,三种 OO 系统各司其职。
S3 类基础
S3 是 R 的简易 OO:class 属性 + 泛型函数。unclass 查看底层。最常用、最轻量。
S3 方法
定义 class.method 函数即可实现泛型。UseMethod 分派。NextMethod 调父方法。
S3 构造
自定义类需提供构造器与校验。structure 一步设类。print / summary 自定义输出。
S4 类
S4 是形式化 OO:setClass 定义槽,validity 校验,setGeneric / setMethod 泛型。
R6 类
R6 是引用语义封装类,方法里用 self$ 访问。面向对象编程更贴近其它语言。
泛型分派
分派基于对象的 class 属性,UseMethod 按 class 找对应方法。旧类(S3)层层尝试。
继承
S3 用 class 属性继承(NextMethod 链),S4 用 contains,R6 用 inherit。
三套系统对比
S3 轻量用于大部分包;S4 用于严谨定义;R6 引用语义适合状态对象。实际多混用。
class 与属性
class 是特殊属性,泛型按它分派。attr 可加自定义属性,不影响分派。class<- 直接设类。
11.错误处理
stop 报错、warning 警告、tryCatch 捕获与条件系统。
stop 报错
stop 抛出错误终止执行。stopifnot 快速校验条件。错误消息建议写清原因。
warning 警告
warning 给出非致命提示,不中断。suppressWarnings 静默。options(warn=2) 转错误。
tryCatch
tryCatch 捕获错误/警告并返回处理结果。错误、警告、finally 三部分。
try 容错
try 返回表达式结果,出错时返回 try-error 类对象,不中断整体。批量处理常用。
条件系统
R 错误/警告/消息都是条件对象。signalCondition 触发,withCallingHandlers 捕获并继续。
警告拦截
withCallingHandlers 捕获警告但不停止执行,可记录并继续。配合 invokeRestart。
restarts 恢复点
信号处理的高级机制:调用者可提供恢复动作。invokeRestart 在捕获端调用。
循环内错误
批量处理时单个失败不应中断全部。tryCatch 逐项容错并保留结果。
自定义错误
自定义错误类携带额外字段。simpleError / structure 构造,class 标识类型。
12.文件与数据 I/O
CSV、readr、逐行读取、RDS、JSON、连接对象与二进制。
CSV 读写
read.csv / write.csv 读写 CSV。stringsAsFactors=FALSE 防止转因子。check.names 处理列名。
readr 读写
readr 是 tidyverse 的快速 CSV 读取。read_csv 自动推断类型,write_csv 快速写出。
逐行读取
readLines 按行读成字符向量。writeLines 写出。处理大文件时逐块读。
read.table 读表
read.table 通用表格读取,read.csv 是其变体。header / sep / na.strings 常用参数。
RDS 存取
saveRDS 存单个 R 对象,readRDS 读回。保留类型与属性,比 CSV 完整。
JSON 读写
jsonlite 是主流 JSON 包。fromJSON 解析,toJSON 序列化。行式 JSON 处理 API 返回。
连接对象
连接是文件/网络等数据源抽象。file 打开、readLines / writeLines 读写、close 关闭。
二进制读写
readBin / writeBin 读写二进制。raw 类型存字节。大文件与图像数据用二进制。
其它格式
readxl 读 Excel,haven 读 SPSS/Stata,feather/parquet 列式格式。按需加载。
13.常见坑
R 日常最常踩的坑与正确写法。
条件长度不为 1
if 需要长度为 1 的条件,向量条件只判第一个并告警。用 any/all 汇总或 ifelse。
因子转数值
因子转数值直接 as.numeric 得到内部编码。先转字符再转数值才是真实值。
维度丢失
矩阵取单行/单列默认降维成向量。drop = FALSE 保持维度。
循环增长向量
循环里 c() 拼接每次复制整个向量,极慢。先预分配或向量化。
NA 与比较
NA 参与比较得到 NA,不会产生 FALSE。排除 NA 用 is.na 判断。
部分匹配
$ 与 [[ 会做唯一前缀匹配。列名缩写的静默行为易藏 bug,用完整名或 dplyr。
循环回收
短向量参与运算会循环补齐到长向量长度。长度不成倍数时只有警告,易出隐蔽 bug。
列表扁平化
c() 对列表会尝试拍平顶层;把列表元素放列表里用 list()。unlist 递归拍平有隐忧。
包遮蔽
library 加载的包会遮蔽同名函数,search 顺序后面的先隐藏。用 :: 消除歧义。
14.并行与并发
parallel、mclapply、foreach、future:R 的多进程并行。
parallel 概览
R 并行基于多进程(fork)或套接字。parallel 包内置 mcapply 与集群。并行有启动开销,任务要够大才划算。
mclapply 并行
mclapply 是 parallel 的并行 lapply,fork 实现。仅 Unix 可用(Windows 需集群)。
集群并行
makeCluster 建进程集群,parLapply 并行应用。Windows 也支持。用后 stopCluster 回收。
foreach 并行
foreach 循环收集结果,%dopar% 并行执行(需 doParallel)。%do% 是串行版。
future 异步
future 包把并行抽象为「未来值」。future() 起异步任务,value() 取结果。plan 选策略。
共享状态
并行 worker 不共享内存:各自拷贝环境。写文件要防并发冲突,结果用 return 收集。
随机数种子
并行时随机数需每 worker 独立种子。set.seed 全局 + clusterSetRNGStream 或 future.seed 保证可复现。
并行性能
并行收益受任务粒度、核数与通信开销限制。先 profile 串行瓶颈,再并行最大块。
15.网络请求
下载、httr2/httr 请求、JSON API、URL 处理与网页抓取。
下载文件
download.file 下载文件。mode 指定二进制。R.utils 支持断点续传。慢速连接可设 timeout。
httr2 请求
httr2 是新一代 HTTP 客户端。req_perform 执行,resp_body_json 解析。管道式构建请求。
GET 请求
GET 读取资源。base 的 readLines 可拉文本;httr GET + content 解析。query 参数拼 URL。
POST 请求
POST 提交数据。body 传 JSON 或表单。httr POST 与 httr2 req_body_json 两种风格。
JSON API
调用 JSON API:请求 + jsonlite 解析。结果常是嵌套列表,flatten 转数据框。分页与错误处理。
URL 处理
parse_url 拆分 URL 组件,URLencode 编码。URLdecode 还原。base 内置处理。
网页抓取
rvest 解析 HTML。html_elements 选节点,html_text 取文本。遵守 robots 与频率限制。
TCP 套接字
socketConnection 建立 TCP 连接,读写字符串。适合简单协议与内网服务。
16.时间与日期
Sys.Date / POSIXct、格式化、lubridate 与时区。
当前时间
Sys.Date 今天日期,Sys.time 当前日期时间。date 当前时间字符串。
日期基础
Date 类是日期类型。as.Date 转换字符串,加减天数。unclass 看天数数值。
POSIXct
POSIXct 存秒级时间戳,POSIXlt 拆分组件。as.POSIXct 解析字符串,处理时区。
格式化
strftime / format 按占位符输出。%Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒。
lubridate 简介
lubridate 提供友好日期函数:ymd / ymd_hms 解析,year / month 取组件,加减间隔。
日期序列
seq 生成日期序列:by 日/月/年。任意间隔工作日用 seq.Date。
时间差
日期相减得 difftime。units 指定单位。as.numeric 取数值。用于耗时统计。
时区
tz 参数指定时区。Sys.timezone 当前时区。OlsonNames 列出合法时区。比较跨时区时刻。
17.进程与环境
运行系统命令、环境变量、命令行参数、平台信息与路径。
运行命令
system 运行系统命令并返回退出码。system2 传参更安全。输出捕获用 capture 或 intern。
环境变量
Sys.getenv 读、Sys.setenv 写。unsetenv 删除。PATH / R 相关变量常用。
命令行参数
commandArgs 取脚本参数。trailingOnly 去掉 R 自身参数。解析用 optparse 或 base 手写。
退出状态
quit 退出 R。q('no') 不保存工作区。错误退出用 quit(status = 1) 供脚本判断。
平台信息
R.version 版本,Sys.info 系统信息,.Platform 平台细节。路径分隔等跨平台处理。
路径管理
file.path 拼接路径,dirname / basename 拆分,normalizePath 规范绝对路径。file.exists 判断。
延时等待
Sys.sleep 暂停指定秒数。可用于限速或等待外部资源就绪。单位是秒。
Rscript 脚本
Rscript 是非交互执行入口,适合定时任务与批处理。脚本开头可加 shebang。
18.正则表达式
grep / grepl、gsub 替换、regexpr 定位、stringr 与常用模式。
grep 与 grepl
grep 返回匹配索引,grepl 返回逻辑向量。ignore.case 忽略大小写。value 返回匹配值。
gsub 替换
gsub 替换全部匹配,sub 只替换第一个。\\1 引用捕获组。perl=TRUE 扩展语法。
regexpr 定位
regexpr 返回首个匹配位置与长度,gregexpr 返回全部。regmatches 提取匹配文本。
语法基础
基础正则元字符:^ 开头 $ 结尾 . 任意 . 字符类 [] 分组 () 量词 * + ? {} 转义 \\。
常用模式
常用模式速查:邮箱、电话、日期、空白清理、提取数字。按需求微调。
stringr 匹配
stringr 正则语法一致但接口统一。str_detect / str_extract / str_match 及 _all 版本。
stringr 替换
str_replace / str_replace_all 替换。regexp 可用 fixed / perl。str_remove 删除匹配。
标志与扩展
perl=TRUE 启用 PCRE 扩展:前瞻、命名组。fixed=TRUE 字面匹配。ignore.case。
19.包管理与构建
CRAN 安装、renv 依赖管理、包结构与 R CMD、testthat、roxygen。
安装包
install.packages 从 CRAN 安装。update.packages 更新。library 加载。开发版用 devtools / remotes。
CRAN 与仓库
CRAN 是官方包仓库。repos 指定镜像。available.packages 列出可安装。CRAN 政策约束发布。
renv 依赖管理
renv 锁定项目依赖版本,类似 Python venv。renv::init 初始化,snapshot / restore 同步锁文件。
包结构
R 包标准结构:DESCRIPTION、R/、man/、tests/、NAMESPACE。R/ 放源码,man/ 放文档。
R CMD 命令
R CMD 系列命令构建/检查包:build 打包、check 检查、INSTALL 安装。发布前必经 check。
testthat 测试
testthat 是主流测试框架。expect_equal 等断言,test_that 组织用例。usethis 生成测试文件。
格式与检查
styler 统一代码风格,lintr 静态检查。配合 RStudio Addins 或 pre-commit 保持整洁。
roxygen 文档
roxygen2 用注释生成 .Rd 文档。#' 开头,@param / @return / @export 标签。函数文档与源码同处。
会话复现
sessionInfo 记录版本与依赖,保证可复现。renv.lock 锁依赖。R 版本也要记录。
关于本速查
本页是 R 4.4 的自包含速查手册,覆盖 base R 与 tidyverse 在真实数据分析中最常用的约 80% 场景。内容偏向现代惯用法:原生管道 `|>`、匿名函数 `\(x)` 简写、`data.frame` 配 `stringsAsFactors = FALSE`、向量化 `ifelse`、`purrr::map_*` 类型化集合操作,以及 R 独特的复制时修改(copy-on-modify)与 environment 引用语义。权威参考见官方 R 手册与 R for Data Science。 19 个章节各自聚焦一个主题——从第一个程序、变量与类型到 apply 家族、S3/R6 面向对象、并行与网络。每节拆成 8–9 个带示例的小节(每个 5–20 行),共约 160 个主题。代码片段刻意短小、自解释,复制即可粘贴进 R 或 RStudio 运行。 所有处理都在浏览器中完成——无上传、无追踪。本页是 GuruToolkit 免费开发者工具集的一部分;代码片段可自由使用,无任何担保。
版本 2.1.0