как отправить метод summary () в объект R6 - PullRequest
2 голосов
/ 08 января 2020

Я использую R6 для создания объекта, поля которого включают в себя фрейм данных и другую информацию.
Я определил первый метод $print(), который я могу назвать как obj1$print() или print(obj1), и оба способа прекрасно работают ,

> obj1$print()
test object name: AA
> print(obj1)
test object name: AA

Я определил второй метод $summary(), который является обобщенной c функцией, такой же, как $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]))

Насколько я понимаю, внутри объекта вы можете определить методы с тем же именем, что и функции generi c, и эти методы автоматически отправляются в функцию на основе класса объекта, так как случается с $print(). Разве это не правильно?
Почему тот же подход не работает с $summary()? Как я могу это исправить?

Большое спасибо за помощь.

1 Ответ

2 голосов
/ 08 января 2020

Методы S3, которые вы ищете, отличаются от методов R6. Во-первых, они не являются частью объекта.

Создайте метод S3 для своего класса:

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

summary(obj1)
...