R 使用面向对象编程(S3 和 S4)将多个函数转换为一个对象
R Turning several functions to one object using Object Oriented Programming (S3 and S4)
我正在尝试了解如何在 R 中将函数转换为面向对象的编程。例如,如何使用 S3(然后是 S4)将数据和下面的 2 个函数转换为一个对象?
(也许其他一些简单的数据和函数可以更好地作为示例?)
data <- c(1, 2, 3)
# Function 1
adding_1 <- function(x){
x <- x+1
}
# Function 2
subtracting_1 <- function(x){
x <- x-1
}
以及如何使用 OOP 执行以下功能。
data1 <- adding_1(data)
data1
data2 <- subtracting_1(data)
data2
在 R 中,面向对象编程的实现方式多种多样。
S3 类型的 OO 是最常用的,因为它非常简单,但在让看似相同的功能对不同类型的对象表现不同方面做得很好。一个很好的参考是 Advanced R by Hadley Wickham。
在 R 中对象有 attributes
。这些属性之一是特殊的 class
属性。你可以用
看到这个
x <- 1:3
y <- c(1, 2, 3)
class(x) # "integer"
class(y) # "numeric"
S3系统是一个函数重载系统。定义了一个特殊函数,generic。然后其他函数,方法,被定义为处理依赖于它们的对象或它们的classes。必须定义的方法是默认方法。
这里我用你的例子首先定义了一个泛型,然后是默认方法。
# Function 1
adding_1 <- function(x, ...) UseMethod("adding_1")
adding_1.default <- function(x, ...){
x <- x + 1
x
}
现在 class "list"
和 "data.frame"
.
对象的方法
adding_1.list <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], adding_1)
x
}
adding_1.data.frame <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], adding_1)
x
}
subtracting_1
也是如此。
# Function 2
subtracting_1 <- function(x, ...) UseMethod("subtracting_1")
subtracting_1.default <- function(x){
x <- x - 1
x
}
subtracting_1.list <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], subtracting_1)
x
}
subtracting_1.data.frame <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], subtracting_1)
x
}
测试用例。
当使用 x
作为参数(或上面的 y
)调用时,它是默认调用的方法,因为没有 adding_1.integer
和 adding_1.numeric
。
mat
也是如此。
但是当使用数据框调用时,需要进行特殊处理,以免函数尝试将 1
添加到字符串或其他类型的非数字列向量中,这些列向量可能位于数据框。
mat <- matrix(1:6, 3)
df1 <- data.frame(x = letters[1:5], y = rnorm(5), z = 101:105)
adding_1(x)
adding_1(mat)
adding_1(df1)
subtracting_1(x)
subtracting_1(mat)
subtracting_1(df1)
我正在尝试了解如何在 R 中将函数转换为面向对象的编程。例如,如何使用 S3(然后是 S4)将数据和下面的 2 个函数转换为一个对象? (也许其他一些简单的数据和函数可以更好地作为示例?)
data <- c(1, 2, 3)
# Function 1
adding_1 <- function(x){
x <- x+1
}
# Function 2
subtracting_1 <- function(x){
x <- x-1
}
以及如何使用 OOP 执行以下功能。
data1 <- adding_1(data)
data1
data2 <- subtracting_1(data)
data2
在 R 中,面向对象编程的实现方式多种多样。
S3 类型的 OO 是最常用的,因为它非常简单,但在让看似相同的功能对不同类型的对象表现不同方面做得很好。一个很好的参考是 Advanced R by Hadley Wickham。
在 R 中对象有 attributes
。这些属性之一是特殊的 class
属性。你可以用
x <- 1:3
y <- c(1, 2, 3)
class(x) # "integer"
class(y) # "numeric"
S3系统是一个函数重载系统。定义了一个特殊函数,generic。然后其他函数,方法,被定义为处理依赖于它们的对象或它们的classes。必须定义的方法是默认方法。
这里我用你的例子首先定义了一个泛型,然后是默认方法。
# Function 1
adding_1 <- function(x, ...) UseMethod("adding_1")
adding_1.default <- function(x, ...){
x <- x + 1
x
}
现在 class "list"
和 "data.frame"
.
adding_1.list <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], adding_1)
x
}
adding_1.data.frame <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], adding_1)
x
}
subtracting_1
也是如此。
# Function 2
subtracting_1 <- function(x, ...) UseMethod("subtracting_1")
subtracting_1.default <- function(x){
x <- x - 1
x
}
subtracting_1.list <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], subtracting_1)
x
}
subtracting_1.data.frame <- function(x, ...){
num <- sapply(x, is.numeric)
x[num] <- lapply(x[num], subtracting_1)
x
}
测试用例。
当使用 x
作为参数(或上面的 y
)调用时,它是默认调用的方法,因为没有 adding_1.integer
和 adding_1.numeric
。
mat
也是如此。
但是当使用数据框调用时,需要进行特殊处理,以免函数尝试将 1
添加到字符串或其他类型的非数字列向量中,这些列向量可能位于数据框。
mat <- matrix(1:6, 3)
df1 <- data.frame(x = letters[1:5], y = rnorm(5), z = 101:105)
adding_1(x)
adding_1(mat)
adding_1(df1)
subtracting_1(x)
subtracting_1(mat)
subtracting_1(df1)