R语言中的S3 泛型与方法

R语言中的泛型函数

0) 什么是泛型函数?

····在 R 里面,有一些函数看起来"一个名字能干好多事"。比如你用 print() 打印一个向量,结果是直接输出数字;用 print() 打印一个数据框,它会自动排成表格;而打印线性模型(lm),它会显示系数和统计结果。为什么同一个函数会有不一样的行为呢?这就是 泛型函数(generic function) 在发挥作用。泛型函数本身并不干具体的活,它只是一个"分派员"。当你调用它时,它会先看看你给的对象是什么类型(类 class),然后把任务交给专门为这个类写好的方法函数去执行。如果找不到,就会退而求其次,调用一个默认的方法。


1) 自定义泛型 describe()

代码
r 复制代码
# 定义泛型
describe <- function(x, ...) {
  UseMethod("describe")
}

# 定义方法
describe.data.frame <- function(x, ...) {
  cat("This is a data frame with", nrow(x), "rows.\n")
}

describe.numeric <- function(x, ...) {
  cat("This is a numeric vector of length", length(x), "\n")
}

# 默认兜底方法
describe.default <- function(x, ...) {
  cat("No specific method for class:", class(x), "\n")
}

# 测试
describe(1:5)          # numeric → describe.numeric
describe(mtcars)       # data.frame → describe.data.frame
describe("hello")      # default → describe.default
预期输出
复制代码
This is a numeric vector of length 5
This is a data frame with 32 rows.
No specific method for class: character

2) 已是泛型函数(如 printsummary)的情况

这些函数本身已经是泛型(内部自带 UseMethod()),所以你直接写方法即可,无需重新定义。

示例:print()summary()
r 复制代码
# 定义一个类
obj <- list(a = 1, b = 2)
class(obj) <- "myclass"

# 定义 print 方法
print.myclass <- function(x, ...) {
  cat("myclass object with fields:", paste(names(x), collapse = ", "), "\n")
}

# 定义 summary 方法
summary.myclass <- function(object, ...) {
  list(length = length(object), names = names(object))
}

# 测试
print(obj)
summary(obj)
预期输出
复制代码
myclass object with fields: a, b

$length
[1] 2

$names
[1] "a" "b"

3) 常见的泛型函数列表

分类 常见泛型函数
输出相关 print()summary()str()format()
建模相关 plot()predict()coef()residuals()fitted()update()
数据处理相关 as.data.frame()as.matrix()as.list()
统计相关 mean()median()quantile()

👉 这些函数本身就是泛型,可以直接写 fun.myclass <- function(x, ...) { ... }


📌 速记

  • 自定义泛型:自己写 UseMethod("fun")
  • 已有泛型:直接写 fun.myclass 方法。
  • 判断是否是泛型:isS3generic("fun") 或直接看源码。
相关推荐
2601_962071571 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水2 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero3 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-4 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设6 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
statistican_ABin6 小时前
全球教育水平提升预测分析报告——基于R语言随机森林回归模型的全球40国1960-2020年教育水平预测研究
随机森林·回归·r语言
_Twink1e6 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心6 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长6 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
源代码•宸7 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang