如何在R6对象中分派summary()方法

如何在R6对象中分派summary()方法,r,methods,r6,generic-function,R,Methods,R6,Generic Function,我正在使用R6构建一个对象,其中字段包括数据帧和其他信息。 我定义了第一个方法$print(),我可以将其称为obj1$print()或print(obj1),两种方法都很好 > obj1$print() test object name: AA > print(obj1) test object name: AA 我定义了第二个方法$summary(),它是一个与$print()相同的通用函数:在这种情况下,调用obj1$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)
返回一个错误:

对象[[i]]中出错:用于子集设置环境的参数错误

示例代码如下所示:

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]))


testobjS3方法,您正在寻找的方法与R6方法不同。首先,它们不是对象的一部分

为您的类创建一个S3方法:

summary.testobj <- function(obj) {
    obj$summary()
}

summary(obj1)

summary.testobj谢谢@SmokeyShakers。为了确保我理解你:1
$print()
被定义为S3和R6方法,而
$summary()
被定义为S3方法。2.您的意思是将整个类重写为S3对象,还是在R6对象中包含S3方法?这可能吗?所以您可以看到R6在这里有自己的默认S3打印
R6:::print.R6
。但是它没有一个
摘要
方法。如果我是你,我不会重写任何东西。我认为S3和R6可以很好地协同工作。你的
摘要.testobj
证明了这一点。谢谢,现在很清楚了,我明白了背后的逻辑