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