Расширение методов as.data.frame и as.matrix для объекта, созданного с помощью setRefClass

Я создаю объект ссылочного класса способом, подобным примеру ниже:

# Class -------------------------------------------------------------------

myDataFrame <- setRefClass(Class = "myDataFrame",
                           fields = list(data = "data.frame",
                                         key_columns = "character"))

# Instance ----------------------------------------------------------------

myCars <- myDataFrame$new(data = mtcars,
                          key_columns = c("mpg", "cyl"))

Я создаю show метод для этого класса:

myDataFrame$methods(
    show = function() {
        cat(
            paste("Rows:", nrow(data)),
            paste("Cols:", ncol(data)),
            paste("Summary for key columns:", paste(key_columns, collapse = " ")),
            sep = "\n"
        )
        sapply(data[, key_columns], function(key_col) {
            print(summary(key_col))
        })
    }
)

это работает как предполагалось:

>> myCars
Rows: 32
Cols: 11
Summary for key columns: mpg cyl
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.000   4.000   6.000   6.188   8.000   8.000 

проблема

Я хотел бы расширить этот класс с as.matrix а также as.data.frame методы.

myDataFrame$methods(
    as.matrix = function() {
        as.matrix(data)
    }
)

Это не похоже на работу:

>> myCars$as.matrix()
Error in as.matrix(data) : unused argument (data)
>> as.matrix(myCars)
Error in as.vector(x, mode) : 
  cannot coerce type 'environment' to vector of type 'any'

Желаемые результаты

  • За as.matrix в контексте предоставленного примера результат должен быть эквивалентен as.matrix(mtcars)
  • За as.data.frame результат должен быть эквивалентен as.data.frame(mtcars[,c("mpg", "cyl")]) где отражены выбранные столбцы key_columns,

0 ответов

Вам нужно указать пространство имен для as.matrix, когда имя вашего метода называется тем же, например

myDataFrame$methods(
    as.matrix = function() {
        base::as.matrix(data)
    }
)
Другие вопросы по тегам