【问题标题】:Extending as.data.frame and as.matrix methods for an object created via setRefClass为通过 setRefClass 创建的对象扩展 as.data.frame 和 as.matrix 方法
【发布时间】:2019-04-06 23:22:58
【问题描述】:

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

# 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

【问题讨论】:

    标签: r class oop methods reference-class


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多