基于S3写了一个自定义函数。该函数需要两个输入参数,且根据输入参数的类型选择计算方法:当输入参数为data.frame
时计算两者之和,而输入参数的数据结构为numeric
时,则计算两者的乘积。但是限于我目前对S3和面向对象编程技术的了解,不清楚能否做到:同时根据输入两个参数的数据结构类型,选择计算方法?具体代码和结果如下。
# 创建泛型函数
add <- function(x, y) UseMethod("add")
# 基于S3方法,根据输入的数据类型选择计算方法
# 如果输入变量是data.frame的话,计算两者之和
add.data.frame <- function(x, y) {x + y}
# 如果输入变量是numeric的话,计算两者之积
add.numeric <- function(x, y) {x * y}
# 测试结果
# 输入变量为data.frame的情况
data1 <- data.frame(c(1, 2), c(3, 4))
data2 <- data.frame(c(10, 20), c(30, 40))
add(data1, data2)
# 结果如下
# c.1..2. c.3..4.
# 1 11 33
# 2 22 44
# 输入numeric的情况
data1 <- 1
data2 <- 10
add(data1, data2)
# 结果如下
# [1] 10
# 但是这样的话,add()函数的方法分配取决于参数x的类型
# 也就是说,如果x是data.frame,就选择add.data.frame()方法
# 如果x是numeric的话就选择add.numeric()方法
# 例如
data1 <- data.frame(c(1, 2), c(3, 4))
data2 <- 10
add(data1, data2)
# 想问的问题是,如何同时根据x和y参数的类型选择方法
# 例如,在x和y都是data.frame的时候才选择add.data.frame()方法
# 在x和y都是numeric的时候才选择add.numeric()方法
# 如果x和y一个是data.frame而另一个是numeric,则输出警告
# 解决方法也不是没有……比如这样
# 重写该函数
add <- function(x, y) UseMethod("add")
add.data.frame <- function(x, y) {
if (is.numeric(y)) {
warning("y is not data.frame.")
} else {
x + y
}
}
add.numeric <- function(x, y) {
if (is.data.frame(y)) {
warning("y is not numeric.")
} else {
x * y
}
}
# 测试上面的3个例子
# 第一个例子
data1 <- data.frame(c(1, 2), c(3, 4))
data2 <- data.frame(c(10, 20), c(30, 40))
add(data1, data2)
# 第二个例子
data1 <- 1
data2 <- 10
add(data1, data2)
# 第三个例子
data1 <- data.frame(c(1, 2), c(3, 4))
data2 <- 10
add(data1, data2)
# 但是总觉得这种解决方法……不太对吧?