R: R 基础语法:注释、变量、赋值与输出
最后更新:2026-08-26
上一课我们装好了 R 和 RStudio,跑了第一行
cat("Hello")。这一课我们要把 R 的"语法四件套"——注释、变量、赋值、输出——彻底搞明白。这是后续 28 节课的基础。
R 的语法和其他语言不太一样:注释用 # 而非 //,赋值主流用 <- 而非 =,字符串拼接用 paste() 而非 +。理解这 4 个差异,写 R 代码就成功了一半。
1. 你将学到
- R 的单行注释和多行注释写法
- 变量的命名规则和最佳实践
- 4 种赋值符号(
<-=-><<-)的区别 print()与cat()输出函数的差异- 工作目录的概念和 RStudio Project 的使用
Rscript命令行执行 R 脚本
2. 注释:给代码加"批注"
注释是写给人类看的文字,R 解释器会完全忽略它们。但注释不是"装饰"——它是程序员最重要的沟通工具。
(1) 为什么注释很重要?
想象你 6 个月后回看自己写的代码:
# 没有注释的代码:
x <- df %>% filter(age > 18) %>% mutate(group = ifelse(score >= 60, "pass", "fail"))
# 有注释的代码:
# Filter 18 岁以上成年人,并按分数 60 分划为通过/未通过两组
x <- df %>% filter(age > 18) %>% mutate(group = ifelse(score >= 60, "pass", "fail"))
后者一眼就懂,前者要花 5 分钟猜意思。这就是注释的价值。
(2) R 注释语法
R 只有单行注释(用 #),没有 /* */ 块注释:
| 写法 | 是否支持 | 说明 |
|---|---|---|
# 这是注释 |
✅ | 单行注释,R 唯一支持的方式 |
/* 多行 */ |
❌ | R 不支持,会报语法错误 |
// 单行 |
❌ | R 不支持,会报 object '//' not found |
(3) 多行注释怎么办?
R 没有原生多行注释,但有两种变通方案:
# 方案 1:每行都用 #(推荐,标准做法)
# 第 1 行注释
# 第 2 行注释
# 第 3 行注释
x <- 10
# 方案 2:RStudio 快捷键(最常用)
# 选中多行代码 → Ctrl+Shift+C (macOS: Cmd+Shift+C)
# RStudio 自动在每行加 #,再按一次取消注释
3. 变量与命名规则
变量是用来存储数据的"容器"。R 是动态类型语言,不需要提前声明类型,直接赋值即可。
(1) 命名规则(必须遵守,否则报错)
| 规则 | 错误示例 | 正确示例 | 原因 |
|---|---|---|---|
| 只能包含字母数字下划线点 | 2age <- 25 ❌ |
age2 <- 25 ✅ |
不能以数字开头 |
| 不能包含空格 | my name ❌ |
my_name ✅ |
空格是 R 的语法分隔符 |
| 不能用 R 关键字 | if <- 1 ❌ |
is_if <- 1 ✅ |
if 是控制流关键字 |
| 区分大小写 | Name 和 name 是两个变量 |
name(统一大小写) |
R 严格区分大小写 |
Name、name、NAME 是三个完全不同的变量。
(2) 命名风格(推荐遵守)
R 社区有两种主流命名风格,选一种贯穿始终:
| 风格 | 示例 | 适用场景 |
|---|---|---|
| snake_case(下划线) | user_name, total_count |
tidyverse 风格(推荐) |
| dot.case(点分) | user.name, total.count |
base R 旧风格 |
本教程统一用 snake_case(与 dplyr / ggplot2 等现代 R 包风格一致)。
(3) 查看变量
# 赋值
x <- 10
y <- 20
# 查看单个变量
x
# [1] 10
# 查看所有变量(等效于 Environment 窗格)
ls()
# [1] "x" "y"
ls() 直观得多。
4. 赋值符号:<- vs =
R 有两种顶层赋值符号,功能几乎等价,但推荐用 <-。
(1) 两种写法对比
| 维度 | <- |
= |
|---|---|---|
| 顶层赋值 | ✅ | ✅ |
| 函数内创建局部变量 | ✅ | ❌(会传到外层) |
| 函数调用传参 | ❌(会创建同名变量) | ✅ |
| 社区惯例 | ✅ R 官方推荐 | ❌ 易混淆 |
| 可读性 | ✅ "把右边赋给左边"暗示清楚 | ⚠️ 与数学"等于"混淆 |
# 写法 1:<- (推荐)
x <- 10
# 写法 2:= (可用但不推荐)
x = 10
(2) 反向赋值 -> 与全局赋值 <<-
R 还有两个"高级"赋值符号:
| 符号 | 用途 | 推荐程度 |
|---|---|---|
x <- 10 |
标准赋值(从右到左) | ✅ 强烈推荐 |
10 -> x |
反向赋值(从左到右) | ⚠️ 仅供阅读旧代码时识别 |
x <<- 10 |
全局赋值(穿透函数作用域) | ❌ 几乎不用 |
<<- 和 ->。新手阶段只用 <- 即可。
(3) 空格的重要性:<- vs < -
# 正确:赋值
x <- 10
# 错误:这是"小于号"加上"负 10"(比较 x 和 -10)
x < -10
<- 必须前后都加空格,否则会变成比较运算。少一个空格,含义天差地别。
5. 输出函数:print() vs cat()
R 有两个常用输出函数,功能不同。
(1) 一表看懂差异
| 特性 | print() |
cat() |
|---|---|---|
| 字符串引号 | 显示 "Alice" |
不显示 Alice |
| 向量索引 | 显示 [1] 1 2 3 |
不显示 1 2 3 |
| 多参数拼接 | ❌ 需 paste() |
✅ 直接拼接 |
| 换行符 | 自动换行 | 需手动 \n |
| 自动调用 | ✅ 控制台直接输入对象时 | ❌ 需显式调用 |
| 适用场景 | 调试、看向量 | 输出报告、文本 |
(2) 实际演示
name <- "Alice"
age <- 25
# print() —— 通用输出(带 [1] 和引号)
print(name)
# [1] "Alice"
# cat() —— 拼接输出(推荐,更灵活)
cat("姓名:", name, ",年龄:", age, "\n")
# 姓名: Alice ,年龄: 25
(3) 其他输出函数
| 函数 | 作用 | 适用场景 |
|---|---|---|
message() |
普通消息(可被 suppressMessages() 抑制) |
长脚本提示进度 |
warning() |
警告(不中断程序) | 提示风险但继续执行 |
stop() |
错误(中断程序) | 致命错误,需 tryCatch() 捕获 |
cat() 输出文本信息,用 print() 调试查看变量值。
6. 工作目录
R 启动时会默认进入一个工作目录,读写文件都在这里。
(1) 工作目录的重要性
graph LR
A["R 进程"] --> B["工作目录<br/>(work dir)"]
B --> C["data/sales.csv<br/>(相对路径 = ./data/sales.csv)"]
B --> D["scripts/clean.R<br/>(相对路径)"]
B --> E["output/report.html<br/>(相对路径)"]
style A fill:#fff3cd
style B fill:#d4edda
如果工作目录不对,read_csv("data/sales.csv") 会找不到文件。
(2) 查看和设置工作目录
# 查看当前工作目录
getwd()
# [1] "C:/Users/Alice/Documents"
# 设置工作目录(用 / 或 \\,不要用 \)
setwd("C:/Users/Alice/Projects/my_r_project")
(3) 推荐做法:RStudio Project
手动 setwd() 容易出错(路径里有中文或空格会出问题)。推荐用 RStudio Project:
| 优势 | 说明 |
|---|---|
| 自动设置 | 打开 .Rproj 文件,工作目录自动定位到项目根目录 |
| 项目独立 | 一个项目一套 .R 历史、环境、包,互不干扰 |
| 可移植 | 把整个项目文件夹发给别人,路径不冲突 |
| Git 友好 | RStudio Project 与 Git 集成最佳实践 |
graph LR
A["File → New Project"] --> B["选 New Directory → New Project"]
B --> C["输入项目名 r-tutorial"]
C --> D["RStudio 创建 .Rproj 文件"]
D --> E["以后打开 .Rproj<br/>工作目录自动设置"]
r-tutorial),把所有 .R 脚本放进去。
7. 命令行执行:Rscript
如果你想不打开 RStudio就运行 R 脚本(自动化、定时任务、Web 后端),用 Rscript。
(1) 创建脚本
在任意位置新建 hello.R 文件:
# hello.R
cat("Hello, World!\n")
(2) 命令行运行
打开终端(Windows 用 cmd / PowerShell,macOS / Linux 用 Terminal),执行:
Rscript hello.R
预期输出:
Hello, World!
Rscript 在 CI/CD、数据管道、Web API(R Plumber)等场景非常常用,是 R 工程师必须掌握的命令。
8. 完整示例:基础语法综合演练
下面是一个完整工作流示例,把本课所有知识点串起来。
▶ 示例:学生信息管理脚本
# ============================================
# 学生信息管理脚本
# 文件名:student.R
# ============================================
# 1. 注释:脚本说明
# 作者:Alice
# 功能:定义学生信息并输出
# 日期:2026-07-02
# 2. 变量赋值(用 <- 不用 =)
student_name <- "Alice"
student_age <- 20
student_score <- 95.5
is_passed <- TRUE
# 3. 用 cat() 输出(推荐,灵活拼接)
cat("=== 学生信息 ===\n")
cat("Name:", student_name, "\n")
cat("Age:", student_age, "\n")
cat("Score:", student_score, "\n")
cat("是否及格:", is_passed, "\n")
# 4. 用 print() 调试(带 [1] 索引)
print(student_name)
print(student_score)
# 5. 简单计算
final_score <- student_score * 0.6 + 100 * 0.4 # 60% 期末 + 40% 平时
cat("\n最终成绩(60% 期末 + 40% 平时):", round(final_score, 2), "\n")
# 6. 删除变量(谨慎使用)
rm(student_name, student_age, student_score, is_passed, final_score)
预期输出:
=== 学生信息 ===
姓名: Alice
年龄: 20
成绩: 95.5
是否及格: TRUE
[1] "Alice"
[1] 95.5
最终成绩(60% 期末 + 40% 平时): 97.3
(1) 操作步骤
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 新建 RStudio Project r-basics |
File → New Project |
| 2 | 在项目里新建 student.R |
Ctrl+Shift+N |
| 3 | 复制上面代码 | 完整粘贴 |
| 4 | 选中全部 → Ctrl+Enter |
发送到控制台 |
| 5 | 控制台查看输出 | 看到 5 行"学生信息" |
❓ 常见问题
x <- 10 和 x < -10 有什么区别?x <- 10 是赋值(把 10 赋给 x),x < -10 是比较(判断 x 是否小于 -10)。少一个空格,含义天差地别。养成 <- 前后都加空格的习惯。📖 小节
- R 用
#写单行注释(没有/* */块注释语法),RStudio 快捷键Ctrl+Shift+C批量注释 - 变量命名规则:字母数字下划线点,不能以数字开头,区分大小写;推荐用
snake_case风格 - 赋值符号首选
<-(R 社区惯例),=在函数传参时用;<-必须前后都加空格(避免与< -混淆) - 输出函数:
print()通用(带[1]索引)、cat()拼接(推荐,灵活)、message()普通消息、warning()警告、stop()错误 - 工作目录用
getwd()/setwd()查看设置;强烈推荐用 RStudio Project 避免路径问题 - 命令行执行 R 脚本用
Rscript hello.R,适用于自动化、CI/CD、Web API 场景
📝 作业
-
基础题:在 RStudio 新建脚本,定义 5 个变量分别存储你的一段文字(
name)、年龄(age)、体重(weight,浮点数)、是否学生(is_student,逻辑值)、城市(city)。用cat()把它们拼成"我是 [name],[age] 岁,体重 [weight] kg,[city] 人,[is_student] 还在读书"输出。运行后截图保存。 -
基础题:新建一个 RStudio Project 命名为
r-basics,在项目里新建variables.R脚本,定义 5 个不同类型的变量(数值、字符、逻辑、复数、空值NA),用typeof()查看每个变量的类型,把 5 个typeof()的输出截图保存。 -
进阶题:写一段脚本,要求:① 用
paste()把"Hello"和"World"拼成 "Hello-World"(sep = "-");② 用cat()输出;③ 用nchar()查看拼接后字符串长度。运行后截图保存控制台输出。 -
挑战题:写一个 R 脚本,要求:① 用
setwd()切换工作目录到tempdir()(R 临时目录);② 用getwd()打印当前工作目录;③ 用save.image()保存工作空间到my_workspace.RData;④ 用rm(list = ls())清空所有变量;⑤ 用load("my_workspace.RData")重新加载。验证加载后变量都还在。运行后截图保存 5 步的全部输出。