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