为通过 setRefClass 创建的对象扩展 as.data.frame 和 as.matrix 方法
Extending as.data.frame and as.matrix methods for an object created via setRefClass
我正在以类似于以下示例的方式创建引用 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
方法 class:
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
方法扩展这个 class。
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
。
当您的方法名称被调用时,您需要为 as.matrix 指定命名空间,例如
myDataFrame$methods(
as.matrix = function() {
base::as.matrix(data)
}
)
我正在以类似于以下示例的方式创建引用 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
方法 class:
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
方法扩展这个 class。
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
。
当您的方法名称被调用时,您需要为 as.matrix 指定命名空间,例如
myDataFrame$methods(
as.matrix = function() {
base::as.matrix(data)
}
)