2

我正在使用 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]))

我的理解是,在一个对象中,您可以定义与泛型函数同名的方法,并且这些方法会根据对象的类自动分派给函数,就像$print(). 这不正确吗?
为什么相同的方法不适用于$summary()? 我该如何解决?

非常感谢您的帮助。

4

1 回答 1

2

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

为您的班级创建一个 S3 方法:

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

summary(obj1)
于 2020-01-07T21:47:55.680 回答