如何在 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)