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