R语言S3系统 #

一、S3系统概述 #

S3是R语言最简单、最常用的面向对象系统,基于泛型函数实现。

二、创建S3对象 #

2.1 基本创建 #

r
student <- list(name = "张三", age = 20, score = 85)
class(student) <- "Student"

print(student)

2.2 使用构造函数 #

r
Student <- function(name, age, score) {
  obj <- list(name = name, age = age, score = score)
  class(obj) <- "Student"
  obj
}

s1 <- Student("张三", 20, 85)
print(s1)

2.3 查看类 #

r
class(s1)
inherits(s1, "Student")

三、泛型函数 #

3.1 创建泛型函数 #

r
greet <- function(x) {
  UseMethod("greet")
}

greet.Student <- function(x) {
  cat("你好,我是学生", x$name, "\n")
}

greet(s1)

3.2 默认方法 #

r
greet.default <- function(x) {
  cat("你好!\n")
}

greet(123)
greet("hello")

3.3 多个类方法 #

r
Teacher <- function(name, subject) {
  obj <- list(name = name, subject = subject)
  class(obj) <- "Teacher"
  obj
}

greet.Teacher <- function(x) {
  cat("你好,我是", x$subject, "老师", x$name, "\n")
}

t1 <- Teacher("李老师", "数学")
greet(t1)

四、方法分发 #

4.1 单继承 #

r
GraduateStudent <- function(name, age, score, advisor) {
  obj <- Student(name, age, score)
  obj$advisor <- advisor
  class(obj) <- c("GraduateStudent", class(obj))
  obj
}

greet.GraduateStudent <- function(x) {
  cat("你好,我是研究生", x$name, ",导师是", x$advisor, "\n")
}

gs <- GraduateStudent("王五", 25, 90, "张教授")
greet(gs)
class(gs)

4.2 NextMethod #

r
print.Student <- function(x) {
  cat("学生信息:\n")
  cat("  姓名:", x$name, "\n")
  cat("  年龄:", x$age, "\n")
  cat("  成绩:", x$score, "\n")
  invisible(x)
}

print.GraduateStudent <- function(x) {
  NextMethod()
  cat("  导师:", x$advisor, "\n")
  invisible(x)
}

print(gs)

五、常用泛型函数 #

5.1 print方法 #

r
print.Student <- function(x) {
  cat("学生:", x$name, "\n")
  invisible(x)
}

print(s1)

5.2 summary方法 #

r
summary.Student <- function(object) {
  cat("学生摘要:\n")
  cat("  姓名:", object$name, "\n")
  cat("  成绩等级:", ifelse(object$score >= 60, "及格", "不及格"), "\n")
}

summary(s1)

5.3 plot方法 #

r
plot.Student <- function(x, ...) {
  barplot(c(score = x$score), main = x$name, col = "steelblue")
}

plot(s1)

六、实践示例 #

6.1 银行账户类 #

r
BankAccount <- function(owner, balance = 0) {
  obj <- list(owner = owner, balance = balance)
  class(obj) <- "BankAccount"
  obj
}

deposit.BankAccount <- function(account, amount) {
  account$balance <- account$balance + amount
  cat("存入:", amount, ",余额:", account$balance, "\n")
  account
}

withdraw.BankAccount <- function(account, amount) {
  if (amount > account$balance) {
    stop("余额不足")
  }
  account$balance <- account$balance - amount
  cat("取出:", amount, ",余额:", account$balance, "\n")
  account
}

print.BankAccount <- function(x) {
  cat("账户持有人:", x$owner, "\n")
  cat("余额:", x$balance, "\n")
  invisible(x)
}

acc <- BankAccount("张三", 1000)
print(acc)
acc <- deposit(acc, 500)
acc <- withdraw(acc, 200)

6.2 统计结果类 #

r
StatResult <- function(data, test_name, p_value) {
  obj <- list(
    data = data,
    test_name = test_name,
    p_value = p_value
  )
  class(obj) <- "StatResult"
  obj
}

print.StatResult <- function(x) {
  cat("统计检验:", x$test_name, "\n")
  cat("P值:", format.pval(x$p_value), "\n")
  cat("结论:", ifelse(x$p_value < 0.05, "显著", "不显著"), "\n")
  invisible(x)
}

result <- StatResult(c(1, 2, 3), "t检验", 0.03)
print(result)

七、总结 #

本章学习了:

  • S3对象的创建
  • 泛型函数定义
  • 方法分发机制
  • 常用泛型方法
  • 实际应用示例

S3系统简单灵活,是R语言中最常用的面向对象系统!

最后更新:2026-03-27