扩展通过setRefClass创建的对象的as.data.frame和as.matrix方法

时间:2018-11-02 17:24:16

标签: r class oop methods reference-class

我正在以类似于以下示例的方式创建引用类对象:

# 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.matrixas.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

1 个答案:

答案 0 :(得分:1)

例如,当您的方法名称被称为同一事物时,您需要为as.matrix指定名称空间。

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