R对象的泛化,可以是data.frame或矩阵

时间:2013-03-21 20:33:19

标签: r matrix dataframe

我有一些与编写可以在矩阵和data.frames上工作的函数有关的问题。想象一下:例如:

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

我的问题是:

  1. 对象的一般术语是矩阵还是data.frame?要替换Thing中的DoubleThatThing

  2. thing是否有普遍接受或广泛使用的变量名?

  3. is.matrix(thing) | is.data.frame(thing)是测试此类对象的最佳方法吗?

2 个答案:

答案 0 :(得分:7)

我不确定这是否会对您有所帮助,或者这是否能满足您的需求。但是为什么不声明generic method并为matrixdata.frame定义方法?这是一个假/愚蠢的例子:

# 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

答案 1 :(得分:4)

Matrix和data.frame在下面真的很不一样。它们的共同点是它们有两个维度。因此,您可以测试该常见属性:

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

但我不确定为什么这会优于is.matrix(thing) | is.data.frame(thing)