R语言S4系统 #
一、S4系统概述 #
S4是R语言的正式面向对象系统,提供严格的类型检查和正式的类定义。
二、定义类 #
2.1 基本定义 #
r
setClass("Person",
slots = list(
name = "character",
age = "numeric"
)
)
p <- new("Person", name = "张三", age = 25)
print(p)
2.2 带默认值 #
r
setClass("Student",
slots = list(
name = "character",
age = "numeric",
score = "numeric"
),
prototype = list(
name = NA_character_,
age = NA_real_,
score = 0
)
)
s <- new("Student", name = "李四", age = 20)
print(s)
2.3 验证函数 #
r
setClass("PositiveNumber",
slots = list(
value = "numeric"
),
prototype = list(value = 1)
)
setValidity("PositiveNumber", function(object) {
if (object@value <= 0) {
return("值必须为正数")
}
TRUE
})
new("PositiveNumber", value = 10)
new("PositiveNumber", value = -5)
三、访问槽 #
3.1 使用@操作符 #
r
p <- new("Person", name = "张三", age = 25)
p@name
p@age
3.2 使用slot函数 #
r
slot(p, "name")
slot(p, "age")
3.3 修改槽值 #
r
p@age <- 26
print(p)
四、定义方法 #
4.1 setMethod #
r
setMethod("show", "Person",
function(object) {
cat("姓名:", object@name, "\n")
cat("年龄:", object@age, "\n")
}
)
p <- new("Person", name = "张三", age = 25)
show(p)
4.2 自定义泛型函数 #
r
setGeneric("greet", function(object) standardGeneric("greet"))
setMethod("greet", "Person",
function(object) {
cat("你好,我是", object@name, "\n")
}
)
greet(p)
4.3 多参数方法 #
r
setGeneric("compare", function(x, y) standardGeneric("compare"))
setMethod("compare", c("Person", "Person"),
function(x, y) {
if (x@age > y@age) {
paste(x@name, "比", y@name, "大")
} else {
paste(x@name, "比", y@name, "小或同龄")
}
}
)
p1 <- new("Person", name = "张三", age = 25)
p2 <- new("Person", name = "李四", age = 30)
compare(p1, p2)
五、继承 #
5.1 单继承 #
r
setClass("Employee",
slots = list(
department = "character",
salary = "numeric"
),
contains = "Person"
)
e <- new("Employee",
name = "王五",
age = 30,
department = "技术部",
salary = 10000)
print(e)
5.2 方法继承 #
r
setMethod("show", "Employee",
function(object) {
callNextMethod()
cat("部门:", object@department, "\n")
cat("薪资:", object@salary, "\n")
}
)
show(e)
六、实践示例 #
6.1 统计模型类 #
r
setClass("LinearModel",
slots = list(
formula = "formula",
data = "data.frame",
coefficients = "numeric",
fitted = "numeric",
residuals = "numeric"
)
)
setMethod("show", "LinearModel",
function(object) {
cat("线性模型\n")
cat("公式:", deparse(object@formula), "\n")
cat("系数:\n")
print(object@coefficients)
}
)
setMethod("summary", "LinearModel",
function(object) {
cat("模型摘要\n")
cat("R-squared:", 1 - var(object@residuals) / var(object@data[[1]]), "\n")
}
)
6.2 数据容器类 #
r
setClass("DataContainer",
slots = list(
data = "ANY",
metadata = "list",
created = "POSIXt"
),
prototype = list(
data = NULL,
metadata = list(),
created = Sys.time()
)
)
setMethod("show", "DataContainer",
function(object) {
cat("数据容器\n")
cat("创建时间:", format(object@created), "\n")
cat("数据类型:", class(object@data), "\n")
cat("元数据:", length(object@metadata), "项\n")
}
)
七、总结 #
本章学习了:
- S4类的定义
- 槽的访问和修改
- 方法定义
- 继承机制
- 类型验证
S4系统提供严格的类型检查,适合大型项目开发!
最后更新:2026-03-27