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) 已是泛型函数(如 print
、summary
)的情况
这些函数本身已经是泛型(内部自带 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")
或直接看源码。