r - 如何在 R6 对象中调度 summary() 方法

标签 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$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)返回错误:

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


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

非常感谢您的帮助。

最佳答案

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

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

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

summary(obj1)

关于r - 如何在 R6 对象中调度 summary() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636438/

相关文章:

r - 了解泊松回归中链接函数的计算位置

rpart.plot 删除科学计数法

r - 在列中搜索文本并完全替换

r - 按 ID 将数据帧分成 10 天的间隔

r - 在 R6Class 中创建动态方法,print(ls.str()) 的魔力

java - 在 Java 中获得 "functions in a dictionary"最实用的方法是什么?

javascript - 为什么我不能将对象的方法保存为另一个对象文字的属性

Java 图形用户界面设计 : Use object or use method?

r - 从帮助页面和 pkgdown 中的单独包链接到 R6 方法

r - R6 类变量