如何在 R6 对象中调度 summary() 方法
how to dispatch summary() method in R6 object
我正在使用 R6 构建一个对象,该对象的字段包括数据框和其他信息。
我定义了第一个方法 $print()
,我可以将其称为 obj1$print()
或 print(obj1)
,这两种方法都可以正常工作。
> obj1$print()
test object name: AA
> print(obj1)
test object name: AA
我定义了第二个方法 $summary()
,这是一个与 $print()
相同的通用函数:在这种情况下,调用 obj1$summary()
按预期工作:
> obj1$summary()
test object name: AA
alpha beta
Min. :-1.63751 a :1
1st Qu.:-0.38065 b :1
Median :-0.05854 c :1
Mean :-0.01360 d :1
3rd Qu.: 0.46194 e :1
Max. : 1.34755 f :1
(Other):4
但是summary(obj1)
returns一个错误:
Error in object[[i]] : wrong arguments for subsetting an environment
示例代码如下:
testobj <- R6::R6Class(classname = "testobj",
public = list(
name = NULL,
data = NULL,
initialize = function(name, data) {
self$name <- name
self$data <- data
},
print = function(...) {
cat("test object name: ", self$name, "\n", sep = "")
invisible(self)
},
summary = function() {
cat("test object name: ", self$name, "\n", sep = "")
summary(self$data)
}
)
)
obj1 <- testobj$new(name = "AA",
data = data.frame(alpha = rnorm(10),
beta = letters[1:10]))
我的理解是,在一个对象中,您可以定义与通用函数同名的方法,并且这些方法会根据对象的 class 自动分派给函数,就像 $print()
。对不对?
为什么同样的方法不适用于 $summary()
?我该如何解决?
非常感谢您的帮助。
S3 方法,即您要查找的方法,与 R6 方法不同。一方面,它们不是对象的一部分。
为您的 class 创建一个 S3 方法:
summary.testobj <- function(obj) {
obj$summary()
}
summary(obj1)
我正在使用 R6 构建一个对象,该对象的字段包括数据框和其他信息。
我定义了第一个方法 $print()
,我可以将其称为 obj1$print()
或 print(obj1)
,这两种方法都可以正常工作。
> obj1$print()
test object name: AA
> print(obj1)
test object name: AA
我定义了第二个方法 $summary()
,这是一个与 $print()
相同的通用函数:在这种情况下,调用 obj1$summary()
按预期工作:
> obj1$summary()
test object name: AA
alpha beta
Min. :-1.63751 a :1
1st Qu.:-0.38065 b :1
Median :-0.05854 c :1
Mean :-0.01360 d :1
3rd Qu.: 0.46194 e :1
Max. : 1.34755 f :1
(Other):4
但是summary(obj1)
returns一个错误:
Error in object[[i]] : wrong arguments for subsetting an environment
示例代码如下:
testobj <- R6::R6Class(classname = "testobj",
public = list(
name = NULL,
data = NULL,
initialize = function(name, data) {
self$name <- name
self$data <- data
},
print = function(...) {
cat("test object name: ", self$name, "\n", sep = "")
invisible(self)
},
summary = function() {
cat("test object name: ", self$name, "\n", sep = "")
summary(self$data)
}
)
)
obj1 <- testobj$new(name = "AA",
data = data.frame(alpha = rnorm(10),
beta = letters[1:10]))
我的理解是,在一个对象中,您可以定义与通用函数同名的方法,并且这些方法会根据对象的 class 自动分派给函数,就像 $print()
。对不对?
为什么同样的方法不适用于 $summary()
?我该如何解决?
非常感谢您的帮助。
S3 方法,即您要查找的方法,与 R6 方法不同。一方面,它们不是对象的一部分。
为您的 class 创建一个 S3 方法:
summary.testobj <- function(obj) {
obj$summary()
}
summary(obj1)