R: R 基础语法:注释、变量、赋值与输出

最后更新:2026-08-26

上一课我们装好了 R 和 RStudio,跑了第一行 cat("Hello")。这一课我们要把 R 的"语法四件套"——注释、变量、赋值、输出——彻底搞明白。这是后续 28 节课的基础。

R 的语法和其他语言不太一样:注释用 # 而非 //,赋值主流用 <- 而非 =,字符串拼接用 paste() 而非 +。理解这 4 个差异,写 R 代码就成功了一半。

1. 你将学到



2. 注释:给代码加"批注"

注释是写给人类看的文字,R 解释器会完全忽略它们。但注释不是"装饰"——它是程序员最重要的沟通工具

(1) 为什么注释很重要?

想象你 6 个月后回看自己写的代码:

TEXT 📖 仅展示
# 没有注释的代码:
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 没有原生多行注释,但有两种变通方案:

R
# 方案 1:每行都用 #(推荐,标准做法)
# 第 1 行注释
# 第 2 行注释
# 第 3 行注释
x <- 10

# 方案 2:RStudio 快捷键(最常用)
# 选中多行代码 → Ctrl+Shift+C (macOS: Cmd+Shift+C)
# RStudio 自动在每行加 #,再按一次取消注释
💡 提示:养成"每段代码都写注释"的好习惯。研究表明,6 个月后回看自己写的代码,没有注释的代码几乎读不懂



3. 变量与命名规则

变量是用来存储数据的"容器"。R 是动态类型语言,不需要提前声明类型,直接赋值即可。

(1) 命名规则(必须遵守,否则报错)

规则 错误示例 正确示例 原因
只能包含字母数字下划线点 2age <- 25 age2 <- 25 不能以数字开头
不能包含空格 my name my_name 空格是 R 的语法分隔符
不能用 R 关键字 if <- 1 is_if <- 1 if 是控制流关键字
区分大小写 Namename 是两个变量 name(统一大小写) R 严格区分大小写
⚠️ 注意:R 区分大小写是最容易踩的坑之一。NamenameNAME 是三个完全不同的变量。

(2) 命名风格(推荐遵守)

R 社区有两种主流命名风格,选一种贯穿始终

风格 示例 适用场景
snake_case(下划线) user_name, total_count tidyverse 风格(推荐)
dot.case(点分) user.name, total.count base R 旧风格

本教程统一用 snake_case(与 dplyr / ggplot2 等现代 R 包风格一致)。

(3) 查看变量

R
# 赋值
x <- 10
y <- 20

# 查看单个变量
x
# [1] 10

# 查看所有变量(等效于 Environment 窗格)
ls()
# [1] "x" "y"
💡 提示:用 RStudio 的"环境/历史"窗格(右上)点击变量就能看到值,比 ls() 直观得多。



4. 赋值符号:<- vs =

R 有两种顶层赋值符号,功能几乎等价,但推荐用 <-

(1) 两种写法对比

维度 <- =
顶层赋值
函数内创建局部变量 ❌(会传到外层)
函数调用传参 ❌(会创建同名变量)
社区惯例 ✅ R 官方推荐 ❌ 易混淆
可读性 ✅ "把右边赋给左边"暗示清楚 ⚠️ 与数学"等于"混淆
R
# 写法 1:<-  (推荐)
x <- 10

# 写法 2:=   (可用但不推荐)
x = 10

(2) 反向赋值 -> 与全局赋值 <<-

R 还有两个"高级"赋值符号:

符号 用途 推荐程度
x <- 10 标准赋值(从右到左) ✅ 强烈推荐
10 -> x 反向赋值(从左到右) ⚠️ 仅供阅读旧代码时识别
x <<- 10 全局赋值(穿透函数作用域) ❌ 几乎不用
⚠️ 注意:实际开发中几乎不用 <<-->。新手阶段只用 <- 即可。

(3) 空格的重要性:<- vs < -

R
# 正确:赋值
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) 实际演示

R
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) 工作目录的重要性

100%
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) 查看和设置工作目录

R
# 查看当前工作目录
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 集成最佳实践
100%
graph LR
    A["File → New Project"] --> B["选 New Directory → New Project"]
    B --> C["输入项目名 r-tutorial"]
    C --> D["RStudio 创建 .Rproj 文件"]
    D --> E["以后打开 .Rproj<br/>工作目录自动设置"]
💡 提示:本教程的所有示例,强烈建议新建一个 RStudio Project(如 r-tutorial),把所有 .R 脚本放进去。



7. 命令行执行:Rscript

如果你想不打开 RStudio就运行 R 脚本(自动化、定时任务、Web 后端),用 Rscript

(1) 创建脚本

在任意位置新建 hello.R 文件:

R
# hello.R
cat("Hello, World!\n")

(2) 命令行运行

打开终端(Windows 用 cmd / PowerShell,macOS / Linux 用 Terminal),执行:

BASH
Rscript hello.R

预期输出:

TEXT 📖 仅展示
Hello, World!
💡 提示Rscript 在 CI/CD、数据管道、Web API(R Plumber)等场景非常常用,是 R 工程师必须掌握的命令



8. 完整示例:基础语法综合演练

下面是一个完整工作流示例,把本课所有知识点串起来。

▶ 示例:学生信息管理脚本

R
# ============================================
# 学生信息管理脚本
# 文件名: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)
▶ 试一试

预期输出:

TEXT 📖 仅展示
=== 学生信息 ===
姓名: 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 行"学生信息"

❓ 常见问题

Q x <- 10x < -10 有什么区别?
A 注意空格!x <- 10 是赋值(把 10 赋给 x),x < -10 是比较(判断 x 是否小于 -10)。少一个空格,含义天差地别。养成 <- 前后都加空格的习惯。

📖 小节


📝 作业

  1. 基础题:在 RStudio 新建脚本,定义 5 个变量分别存储你的一段文字(name)、年龄(age)、体重(weight,浮点数)、是否学生(is_student,逻辑值)、城市(city)。用 cat() 把它们拼成"我是 [name],[age] 岁,体重 [weight] kg,[city] 人,[is_student] 还在读书"输出。运行后截图保存。

  2. 基础题:新建一个 RStudio Project 命名为 r-basics,在项目里新建 variables.R 脚本,定义 5 个不同类型的变量(数值、字符、逻辑、复数、空值 NA),用 typeof() 查看每个变量的类型,把 5 个 typeof() 的输出截图保存。

  3. 进阶题:写一段脚本,要求:① 用 paste()"Hello""World" 拼成 "Hello-World"(sep = "-");② 用 cat() 输出;③ 用 nchar() 查看拼接后字符串长度。运行后截图保存控制台输出。

  4. 挑战题:写一个 R 脚本,要求:① 用 setwd() 切换工作目录到 tempdir()(R 临时目录);② 用 getwd() 打印当前工作目录;③ 用 save.image() 保存工作空间到 my_workspace.RData;④ 用 rm(list = ls()) 清空所有变量;⑤ 用 load("my_workspace.RData") 重新加载。验证加载后变量都还在。运行后截图保存 5 步的全部输出。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏