R语言基础 (二):对象、逻辑与函数,包和markdown

大一/大二 R语言入门课程

尹俊贺

👋 欢迎回来!

上节课复习: 我们已经学会了如何打开 RStudio,以及如何像计算器一样使用 R。

这节课目标: 我们要深入 R 的“语法”核心。如果说上节课是学会了“说话”,这节课我们要学习“词性”(数据类型)和“逻辑”(True/False)。

今日大纲: 1. 对象 (Objects) 的种类 2. 如何判断和转换类型 3. 管理你的环境 (Remove & Class) 4. 基本数学与统计函数 5. 核心难点:布尔逻辑 (Boolean Logic) 6. R 的超能力:Packages (包) 7. RMarkdown/Quarto 写作规范

1. 对象的种类 (Types of Objects)

在 R 里面,所有的数据都被装在“盒子”里,这些盒子就是对象 (Objects)。最常见的有三种“材质”的盒子:

  1. Numeric (数值型): 数字,无论是整数还是小数。
    • 例如:1, 3.14, -100
  2. Character (字符型): 文本,必须用引号 ""'' 包果。
    • 例如:"Hello", "R Language", "123" (注意:带引号的数字也是字符!)
  3. Logical (逻辑型): 真或假,只有两个值。
    • TRUE (真, T) 或 FALSE (假, F)
x <- 10.5        # 数值
name <- "Alice"  # 字符
is_student <- TRUE # 逻辑

# 看看它们长什么样
print(x)
[1] 10.5
print(name)
[1] "Alice"

2. 身份查验: is. 系列函数

如果不确定一个盒子里装的是什么,我们可以用 is.xxx() 函数来询问 R。这就像问:“你是数字吗?”

R 会回答你 TRUE (是) 或 FALSE (不是)。

  • is.numeric(x): 是数值吗?

  • is.character(x): 是字符吗?

  • is.logical(x): 是逻辑值吗?

程式碼片段

#| label: check-types

obj1 <- "500"   # 注意引号,这是字符
obj2 <- 500     # 这是数字

# 让我们来测试一下
is.numeric(obj1)   # "500" 是数字吗? -> FALSE
is.numeric(obj2)   # 500 是数字吗? -> TRUE
is.character(obj1) # "500" 是字符吗? -> TRUE

3. 管理对象: Class & Remove

查看类型 (class)

除了问 is.xxx,我们可以直接问 R:“它是什么类别?”,使用 class() 函数。

程式碼片段

class(100)
class("100")
class(TRUE)

删除对象 (rm)

当你的 Environment (右上角) 乱七八糟时,你可以扔掉不需要的盒子。

  • rm(object_name): 删除特定对象。

  • rm(list = ls()): 核弹级指令 —— 删除环境里所有对象(慎用,但在脚本开头清空环境时很常用)。

程式碼片段

a <- 1
rm(a) # 变量 a 从此消失了
# print(a) # 如果运行这行会报错:object 'a' not found

4. 转换函数 (as.)

有时候我们需要把“文本格式的数字”强制变成“真正的数字”才能进行计算。这叫类型转换

  • as.numeric(): 变成数字

  • as.character(): 变成字符

  • as.logical(): 变成逻辑值 (0变FALSE, 非0变TRUE)

注意:如果不小心把 “Hello” 强行转成数字,R 会给你一个 NA (Not Available,缺失值)。

程式碼片段

num_str <- "2024"
class(num_str) # 一开始是 character

# 变身!
real_num <- as.numeric(num_str)
class(real_num) # 现在是 numeric 了
print(real_num + 1) # 可以做加法了

5. 基本数学与统计函数

R 是统计学家的最爱,因为它内置了极其强大的统计功能。

假设我们要分析一个班级的成绩:

scores <- c(85, 92, 78, 60, 95) (注: c() 是把数据打包成向量)

函数 含义 例子 结果
mean() 平均值 mean(scores) 82
median() 中位数 median(scores) 85
sd() 标准差 sd(scores) 14.1
var() 方差 var(scores) 199.5
min() / max() 最小/大值 min(scores) 60
round() 四舍五入 round(3.14159, 2) 3.14
quantile() 百分位数 quantile() 0% 25% 50% 75% 100%

程式碼片段

scores <- c(85, 92, 78, 60, 95)
avg <- mean(scores)
print(paste("平均分是:", avg))

6. 测量长度: length()

length() 函数用来告诉我们一个对象里包含多少个元素。这在处理大型数据时非常重要,用来检查数据行数是否对得上。

程式碼片段

my_vec <- c(1, 2, 3, 4, 5)
length(my_vec)

# 即使是一个单独的数字,长度也是 1
length(100) 

7. 布尔逻辑 (Boolean Logic) - 非常重要!

计算机的世界非黑即白。我们需要学会用逻辑符号来做判断。

核心符号

  • == : 等于 (注意是两个等号!一个等号是赋值)

  • != : 不等于

  • > / < : 大于 / 小于

  • & : AND (并且) - 两者都真才为真

  • | : OR (或者) - 只要有一个真就为真

  • ! : NOT (非) - 真变假,假变真

☔ 逻辑案例:下雨天带伞

假设我们需要写一个程序决定是否会淋湿 (get_wet)

只有当:下雨了 (True) 并且 没带伞 (True) 时,你才会淋湿。

程式碼片段

is_raining <- TRUE      # 外面在下雨
has_umbrella <- FALSE   # 我没有带伞

# 逻辑判断:
# 下雨 AND (没有 伞)
will_get_wet <- is_raining & (!has_umbrella)

print(will_get_wet) 






## 8. TRUE and FALSE (数值本质)

在 R 里面:

**TRUE** 等于 **1**
**FALSE** 等于 **0**

这意味着我们可以对它们做数学运算!


::: {.cell}

```{.r .cell-code}
# 模拟这一周的天气
rain <- c("Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No")

# 1. 看看内部结构 (Internal representation)
# 只要是 "Yes" 的地方就是 TRUE (1)
as.numeric(rain == "Yes") 
[1] 1 1 1 1 1 1 0
# 2. 算算这周下了几天雨?
# 相当于把所有的 1 加起来
sum(rain == "Yes")
[1] 6

:::

9. Other Boolean Operators (筛选神器)

如果我们想知道具体是哪天,或者有没有下雨?

rain <- c("Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No")

1. Which elements are TRUE? (哪几天?) 返回的是位置(下标)。

which(rain == "Yes")
[1] 1 2 3 4 5 6

2. Are any elements TRUE? (有哪怕一天吗?) 只要有一个是 True,就返回 True。

any(rain == "Yes")
[1] TRUE

3. Are all elements TRUE? (全都是吗?) 必须全是 True 才返回 True。

all(rain == "Yes")
[1] FALSE

8. R 的生态系统:包 (Packages)

R 语言的设计哲学是“模块化” (Modularity)

  • Base R (基础 R):这是你安装 R 时自带的核心系统,仅包含最基本的统计和计算功能。
  • Packages (扩展包):由全球开发者贡献的代码集合,用于扩展 R 的功能(如高级绘图、计量经济学模型、生物信息学分析等)。

核心机制:安装与加载

可以将 R 环境想象成一个图书馆 (Library)

动作 对应的 R 函数 现实类比 执行频率
Installation install.packages("pkg") 购书:把书买回来放到书架上。 仅需一次 (Per Device)
Loading library(pkg) 借阅:把书从架子上取下来阅读。 每次 (Per Session)
# [Code Protocol]
# 1. Installation: Only run in Console, rarely in Script.
install.packages("tidyverse")

# 2. Loading: Must be included at the top of your script.
library(tidyverse)

9. 现代数据科学标准:The Tidyverse

在学术界和工业界,tidyverse 是最主流的数据科学工具集。它不是一个单一的包,而是一个共享相同设计理念(Tidy Data)的包集合 (Meta-package)

加载 library(tidyverse) 将自动激活以下核心组件:

📊 Data Visualization

ggplot2

  • 基于“图形语法” (Grammar of Graphics) 的绘图系统。
  • 用于构建分层、复杂的统计图表。
  • Academic standard for publication-quality plots.

🛠 Data Manipulation

dplyr & tidyr

  • 提供了一套“动词” (Verbs) 来处理数据框。
  • filter, select, mutate, summarize
  • 代码逻辑清晰,易于复现 (Reproducible)。

10. 常用工具库一览 (Common Libraries)

作为初学者,建议掌握以下核心库即可覆盖 90% 的课程需求:

Package Domain (领域) Key Functionality (核心功能)
tidyverse Data Science Core 数据清洗、转换与可视化的全套工具
readxl Data Import 读取 Excel 文件 (.xlsx, .xls)
haven Import (Social Sci) 读取 SPSS (.sav), Stata (.dta), SAS 数据
rmarkdown Reproducible Report 生成 PDF/HTML 报告 (即本课件的引擎)

Tidyverse 与 管道 (%>%)

tidyverse 是 R 数据科学最主流的包集合。它引入了“管道操作符” %>% (快捷键: Ctrl/Cmd + Shift + M)。

它的意思是:“把左边的东西,传递给右边”

程式碼片段

# 不用管道
# round(mean(c(1, 2, 3)), 2)  # 层层包裹,很难读

# 使用管道 (逻辑更像人类语言)
library(dplyr) # 需要先加载 dplyr 包
c(1, 2, 3) %>% 
  mean() %>% 
  round(2)

读作:拿数据 -> 算平均值 -> 保留两位小数。

9. RMarkdown/Quarto 规则

你们现在看到的这个幻灯片,就是用 Quarto 写的!它是 RMarkdown 的升级版。

三大组成部分:

  1. YAML Header (头部): 文档最上方 --- 包裹的部分。决定了文档是做成 PDF、网页还是 PPT。

  2. Markdown Text (文本): 普通的文字说明。

    • # 一级标题,## 二级标题

    • **加粗**

  3. Code Chunks (代码块):

    • ```{r} 开头,``` 结尾。

    • 代码必须写在灰色块块里才能运行!

    • 绿色小三角点击运行。

11. 输出与图形控制

3. 洁癖法则 (Clean Output)

R 加载包时喜欢吐出红色提示,显得不专业,用这些关掉它:

  • warning: false (隐藏警告,如版本差异)

  • message: false (隐藏通知,如加载成功信息)

  • error: true (允许代码报错并继续生成文档,防止因一道题卡住交不了作业)

4. 图片尺寸 (Figures)

控制画图的大小和位置:

  • fig-width: 6 (宽,英寸)

  • fig-height: 4 (高,英寸)

  • fig-align: "center" (居中/left/right)

R

```
#| fig-width: 5 #| fig-align: “center” #| echo: false

plot(1:10, main = “居中的小图”)

🎓 课程总结:我们今天学会了什么?

今天我们完成了从“使用计算器”到“编写程序”的关键跨越。我们并没有处理复杂的数据,而是先打好了地基:

  1. 认清数据的“身份” (Objects)
    • 我们明白了 R 对数字、文字和逻辑极其敏感。
    • Takeaway: "100" 只是文本,100 才是数字。
  2. 学会像计算机一样思考 (Logic)
    • 这是编程的“大脑”。通过韦恩图,我们学会了如何用 TRUEFALSE 来做筛选和决策。
    • Takeaway: 逻辑不仅是数学,更是我们在数据海洋中找到目标的“筛子”。
  3. 掌握现代工具 (Packages & Quarto)
    • 我们走出了 Base R 的原始森林,学会了调用 library (特别是 tidyverse) 来武装自己。
    • 同时,我们学会了用 Quarto 优雅地管理代码和输出。