跳转至

实验课1 R语言基础编程 R代码整理

对应材料:

  • 实验/实验课件/实验课1-R语言基础编程.pptx
  • 回放/生物信息学(协和班)第3周星期4第8,9节_笔记.txt

本节考试要求

1. 本节要求

  • 这节实验课本质上是 10 道基础 R 编程题。
  • 内容集中在最基础的语法和数据结构上,包括:
  • 向量创建与筛选
  • 奇偶判断
  • 矩阵创建与命名
  • list 构建与索引
  • if / else if / else
  • 自定义函数
  • factortable
  • for 循环
  • 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()

  • 考矩阵按列合并。
  • 老师在回放里专门点了:
  • cbind
  • colnames

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 循环从 150
  • 每次把当前项加进去
  • 阶乘用 factorial(i)
  • 最后比较 EyEz
  • 再用 abs() 求绝对差

可以把这题理解成一个“逐项累加”的经典循环题。

四、老师在回放里的核心要求

1. 这节课就是纯基础编程训练

  • 老师明确说这节课“没有什么应用”,就是纯粹的编程题。
  • 因此这节课不需要过度联想生物学背景,重点是语法熟练。

2. 这 10 题要练到很熟

  • 老师明确表示,期末如果考基础编程,会从这些题或非常类似的题里出。
  • 不要求一字不差背代码,但要能独立写出同类题。

3. 不要求画流程图

  • 这节课老师明确说没有让大家画编程流程图。
  • 原因不是流程图不重要,而是这 10 道题太基础,直接写代码更合适。

4. 写法可以不同,但结果必须对

  • 老师提供的是“参考思路”。
  • 你完全可以按自己的思路写。
  • 老师更看重:
  • 逻辑是否对
  • 结果是否对

5. 基础语法是后续实验课的入口

  • 老师在课尾强调,这节课结束以后,基础 R 语法算是入门。
  • 后面实验课会进入更接近“算法”或分析流程的内容,但都是建立在这一课的基础上的。

五、这节课最容易考的小点

  • %% 是什么,怎么判断奇偶
  • cbind() 是按列合并,不是按行
  • matrix()nrowncolbyrow
  • paste() / paste0() 如何给行列命名
  • list 如何命名和取元素
  • if / else if / else 的结构怎么写
  • factor()table() 分别干什么
  • factorial() 是什么
  • abs() 是什么
  • 循环累加时为什么先设初值

六、几处容易写错的地方

1. else if 语法

  • 回放里老师专门看了同学这里的写法。
  • 复习时要注意:
  • if (...) { ... } else if (...) { ... } else { ... }
  • 不要把结构写乱。

2. 等级划分区间

  • 课件标准是:
  • A >= 90
  • 80 <= B < 90
  • 70 <= C < 80
  • 60 <= D < 70
  • E < 60
  • 所以判断顺序最好从高到低写。

3. table() 前最好固定 level 顺序

  • 如果直接 table(grade_y),有时显示顺序可能不稳定。
  • 所以更稳的写法是:
table(factor(grade_y, levels = c("A", "B", "C", "D", "E")))

4. 第 10 题不要忘记初值 1

  • 题目不是单纯求和,而是:
E = 1 + ...
  • 所以初始化不能写成 0

七、适合考试背诵的一条主线

这节实验课可以压成下面这条最短复习主线:

向量创建
-> 奇偶筛选
-> 矩阵合并与命名
-> matrix 创建 10x10 矩阵
-> list 构建与索引
-> if/else 划分等级
-> factor + table 统计频数
-> 自定义函数 + for 循环 + factorial + abs 计算 Ey/Ez

八、一句总结

这节实验课不是流程型实验,而是期末基础编程题的直接题库。最重要的不是背概念,而是把这 10 道题写熟,尤其是:

  • 奇偶筛选
  • 矩阵/list 操作
  • if / else if
  • factor + table
  • 最后一题的函数与循环累加