实验课1 R语言基础编程 R代码整理¶
对应材料:
实验/实验课件/实验课1-R语言基础编程.pptx回放/生物信息学(协和班)第3周星期4第8,9节_笔记.txt
本节考试要求¶
1. 本节要求¶
- 这节实验课本质上是
10道基础R编程题。 - 内容集中在最基础的语法和数据结构上,包括:
- 向量创建与筛选
- 奇偶判断
- 矩阵创建与命名
list构建与索引if / else if / else- 自定义函数
factor与tablefor循环factorial()与abs()
2. 考试掌握程度¶
- 老师这节课的态度很明确:这部分属于必须熟练掌握的基础编程。
- 回放里老师明确说,这
10道题本身“很简单”,但期末如果考基础编程,大概率就是这些题或非常类似的变形。 - 这节课不强调应用背景,重点就是:
- 看懂题目
- 能自己写出来
- 能跑出正确结果
3. 老师重点强调¶
- 这
10道题要会,至少要做到“非常类似的题能独立写出来”。 - 老师提供的是一种参考思路,不是唯一写法;过程可以不同,但结果必须对。
- 这节课没有要求画流程图,因为老师认为题目太基础、太直接。
- 最后一道函数题稍微复杂一些,是这节课里最需要重点练熟的一题。
- 条件分支写法要注意
else if语法,不要因为换行或拼写把代码写错。
4. 与期末重点重合¶
- 高度重合,优先复习:这节课直接对应期末里的基础编程小题。
- 和最后两节课提到的“基础编程肯定要考”完全一致。
- 虽然这节课本身不是流程图课,但它是后面所有实验课代码理解的基础,因此属于“作为基础必须会”。
一、结合课件与回放整理后的主干 R 代码¶
# 1. 定义一个包含从 1 到 100 的向量 x
x <- 1:100
# 2. 将向量 x 中的偶数定义成向量 y
y <- x[x %% 2 == 0]
# 3. 将向量 x 中的奇数定义成向量 z
z <- x[x %% 2 == 1]
# 4. 创建一个 50x2 的矩阵 m,包含 y 和 z,并命名列
m <- cbind(y, z)
colnames(m) <- c("Even", "Odd")
# 5. 利用 x 创建一个 10x10 的矩阵 n,并命名行列
n <- matrix(x, nrow = 10, ncol = 10, byrow = TRUE)
colnames(n) <- paste0("C", 1:10)
rownames(n) <- paste0("R", 1:10)
# 6. 创建一个 list,包含 x, y, z, m, n,并输出其中的 matrix_y
list_data <- list(
vector_x = x,
vector_y = y,
vector_z = z,
matrix_m = m,
matrix_y = n
)
list_data$matrix_y
# 7. 将 x 中的数分成 A, B, C, D, E 五个等级
grade_fun <- function(v) {
grade <- character(length(v))
for (i in seq_along(v)) {
if (v[i] >= 90) {
grade[i] <- "A"
} else if (v[i] >= 80) {
grade[i] <- "B"
} else if (v[i] >= 70) {
grade[i] <- "C"
} else if (v[i] >= 60) {
grade[i] <- "D"
} else {
grade[i] <- "E"
}
}
grade
}
grade_x <- grade_fun(x)
# 8. 统计 y 中 A, B, C, D, E 的数目
grade_y <- grade_fun(y)
table(factor(grade_y, levels = c("A", "B", "C", "D", "E")))
# 9. 统计 z 中 A, B, C, D, E 的数目
grade_z <- grade_fun(z)
table(factor(grade_z, levels = c("A", "B", "C", "D", "E")))
# 10. 编写函数计算 Ey 和 Ez
# Ey = 1 + y[1]/1! + y[2]^2/2! + y[3]^3/3! + ... + y[50]^50/50!
# Ez 同理
calc_E <- function(v) {
E <- 1
for (i in seq_along(v)) {
E <- E + v[i]^i / factorial(i)
}
E
}
Ey <- calc_E(y)
Ez <- calc_E(z)
if (Ey > Ez) {
print("Ey > Ez")
} else if (Ey < Ez) {
print("Ey < Ez")
} else {
print("Ey == Ez")
}
abs(Ey - Ez)
二、这 10 道题分别在考什么¶
1. x <- 1:100¶
- 考最基本的向量创建。
- 老师强调这类题应该一眼就能写出来。
2. y <- x[x %% 2 == 0]¶
- 考:
- 取模运算
%% - 逻辑筛选
- 回放里老师专门说:判断偶数,就看“除以
2余数是不是0”。
3. z <- x[x %% 2 == 1]¶
- 和上一题同一逻辑。
- 判断奇数,就看“除以
2余数是不是1”。
4. cbind() 和 colnames()¶
- 考矩阵按列合并。
- 老师在回放里专门点了:
cbindcolnames
5. matrix()、colnames()、rownames()、paste0()¶
- 这题考的是:
- 矩阵创建
- 行列命名
- 字符串和数字拼接
- 老师提到这里要会用
paste一类函数把C和数字、R和数字拼起来。
6. list() 与 $ 索引¶
- 考 list 数据结构。
- 需要会:
- 把不同类型对象放进一个 list
- 给各元素命名
- 用
$或[[ ]]取出指定元素
7. if / else if / else¶
- 这是本节最重要的基础控制语句之一。
- 回放末尾老师还专门看了同学的
else if写法,说明这类语法细节容易出错。
8-9. factor() 与 table()¶
- 这两题不是在考复杂算法,而是在考:
- 分类结果统计
- 频数表输出
- 回放里老师明确说:
- 先把结果变成等级
- 再用
table自动统计每一类数量
10. 自定义函数 + for 循环 + factorial() + abs()¶
- 这是这节实验课里最综合的一题。
- 主要考:
- 写函数
- 设置初始值
- 循环累加
- 阶乘
factorial() - 条件判断比较大小
- 绝对值
abs()
三、最后一题的公式和代码思路¶
课件第 10 题的公式是:
Ey = 1 + y[1]/1! + y[2]^2/2! + y[3]^3/3! + ... + y[50]^50/50!
Ez = 1 + z[1]/1! + z[2]^2/2! + z[3]^3/3! + ... + z[50]^50/50!
老师在回放里对这题的讲法很明确:
- 先定义一个函数
- 设一个初始值,例如
E <- 1 - 用
for循环从1到50 - 每次把当前项加进去
- 阶乘用
factorial(i) - 最后比较
Ey和Ez - 再用
abs()求绝对差
可以把这题理解成一个“逐项累加”的经典循环题。
四、老师在回放里的核心要求¶
1. 这节课就是纯基础编程训练¶
- 老师明确说这节课“没有什么应用”,就是纯粹的编程题。
- 因此这节课不需要过度联想生物学背景,重点是语法熟练。
2. 这 10 题要练到很熟¶
- 老师明确表示,期末如果考基础编程,会从这些题或非常类似的题里出。
- 不要求一字不差背代码,但要能独立写出同类题。
3. 不要求画流程图¶
- 这节课老师明确说没有让大家画编程流程图。
- 原因不是流程图不重要,而是这
10道题太基础,直接写代码更合适。
4. 写法可以不同,但结果必须对¶
- 老师提供的是“参考思路”。
- 你完全可以按自己的思路写。
- 老师更看重:
- 逻辑是否对
- 结果是否对
5. 基础语法是后续实验课的入口¶
- 老师在课尾强调,这节课结束以后,基础
R语法算是入门。 - 后面实验课会进入更接近“算法”或分析流程的内容,但都是建立在这一课的基础上的。
五、这节课最容易考的小点¶
%%是什么,怎么判断奇偶cbind()是按列合并,不是按行matrix()的nrow、ncol、byrowpaste()/paste0()如何给行列命名list如何命名和取元素if / else if / else的结构怎么写factor()和table()分别干什么factorial()是什么abs()是什么- 循环累加时为什么先设初值
六、几处容易写错的地方¶
1. else if 语法¶
- 回放里老师专门看了同学这里的写法。
- 复习时要注意:
if (...) { ... } else if (...) { ... } else { ... }- 不要把结构写乱。
2. 等级划分区间¶
- 课件标准是:
A >= 9080 <= B < 9070 <= C < 8060 <= D < 70E < 60- 所以判断顺序最好从高到低写。
3. table() 前最好固定 level 顺序¶
- 如果直接
table(grade_y),有时显示顺序可能不稳定。 - 所以更稳的写法是:
4. 第 10 题不要忘记初值 1¶
- 题目不是单纯求和,而是:
- 所以初始化不能写成
0。
七、适合考试背诵的一条主线¶
这节实验课可以压成下面这条最短复习主线:
向量创建
-> 奇偶筛选
-> 矩阵合并与命名
-> matrix 创建 10x10 矩阵
-> list 构建与索引
-> if/else 划分等级
-> factor + table 统计频数
-> 自定义函数 + for 循环 + factorial + abs 计算 Ey/Ez
八、一句总结¶
这节实验课不是流程型实验,而是期末基础编程题的直接题库。最重要的不是背概念,而是把这 10 道题写熟,尤其是:
- 奇偶筛选
- 矩阵/list 操作
if / else iffactor + table- 最后一题的函数与循环累加