作为data.frame或矩阵的R对象的泛化

作为data.frame或矩阵的R对象的泛化,r,matrix,dataframe,R,Matrix,Dataframe,我有几个问题与编写一个既能处理矩阵又能处理数据帧的函数有关。例如,想象一下: DoubleThatThing <- function(thing) { stopifnot(is.matrix(thing) | is.data.frame(thing)) 2 * thing } 矩阵和data.frame在下面是完全不同的。它们的共同点是它们有两个维度。因此,您可以测试该公共属性: DoubleThatThing <- function(thing) { stopi

我有几个问题与编写一个既能处理矩阵又能处理数据帧的函数有关。例如,想象一下:

DoubleThatThing <- function(thing) {
   stopifnot(is.matrix(thing) | is.data.frame(thing))
   2 * thing
}

矩阵和data.frame在下面是完全不同的。它们的共同点是它们有两个维度。因此,您可以测试该公共属性:

DoubleThatThing <- function(thing) {
   stopifnot(length(dim(thing)) == 2)
   2 * thing
}

double那东西我不确定这是否对你有帮助,或者这是否能满足你的需要。但是为什么不声明一个
通用方法
,并为
矩阵
数据帧
定义方法呢??下面是一个愚蠢的例子:

# generic method
my_fun <- function(x, ...) {
    UseMethod("my_fun", x)
}

# default action
my_fun.default <- function(x, ...) {
    cx <- class(x)
    stop(paste("No method defined for class", cx))
}

# method for object of class data.frame
my_fun.data.frame <- function(x, ...) {
    print("in data.frame")
    tapply(x[,1], x[,2], sum)
}

# method for object of class matrix
my_fun.matrix <- function(x, ...) {
    print("in matrix")
    my_fun(as.data.frame(x))
}

# dummy example
df <- data.frame(x=1:5, y=c(1,1,1,2,2))
mm <- as.matrix(df)

> my_fun(df)
# [1] "in data.frame"
# 1 2 
# 6 9 

> my_fun(mm)
# [1] "in matrix"
# [1] "in data.frame"
# 1 2 
# 6 9 

> my_fun(as.list(df))
# Error in my_fun.default(as.list(df)) : No method defined for class list
#通用方法

我的乐趣提前谢谢你。我觉得这个问题有点边缘化,我更愿意在R聊天上问,但我的工作代理不允许我问。如果它是闭合的,我会理解的。我认为矩阵和数据帧对于R是完全不同的。matix是数组的一种特殊形式,它本身就是一个向量,它的维度有额外的属性。另一方面,数据帧是长度相同的变量列表。所以我不确定你要找的“东西”是否会有一个术语……我想我更喜欢数据、帧和矩阵的分离方法。对象类的测试基本上包括在内。“R聊天”?那到底是什么?我希望你不是指R-help。你能把矩阵/数据.按行/列进行框切并用一个列表进行操作吗?另外,为了结束OP问题的另一部分,再加上一点:
thing
可以简单地描述它是什么,如
twoDimThing