2013-03-21 79 views
2

我有几个问题与编写可以在矩阵和data.frames上工作的函数有关。试想一下,比如:R对象的泛化是数据框架还是矩阵

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

我的问题是:

  1. 是否有一个对象,它可以是一个矩阵或data.frame的总称? DoubleThatThing需要替换Thing

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

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

+0

在此先感谢。我觉得这个问题是边缘化的,我宁愿问R聊天,但我的代理工作不会允许我。我会理解,如果它关闭。 – flodel 2013-03-21 20:34:47

+0

我认为矩阵和数据框对于R.而言是完全不同的。matix是一种特殊的数组形式,它本身就是一个具有其维度的附加属性的向量。另一方面,数据框是一个长度相同的变量列表。所以我不确定会有一个术语“你正在寻找的东西”...... – juba 2013-03-21 20:39:32

+1

我想我宁愿单独使用data.frames和matrices的方法。对象类的测试包含在内。 – Roland 2013-03-21 20:46:57

回答

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 
+0

+1为基于通用方法的解决方案 – 2013-03-22 03:15:07

4

Matrix和data.frame在底下真的很不一样。他们的共同点是它们有两个维度。所以,你可以测试的常见属性:

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

但我不知道为什么,这将是最好is.matrix(thing) | is.data.frame(thing)

+0

而且,为了完成OP的问题的其他部分,添加一点:'thing'可以简单地描述它是什么,就像'twoDimThing'中一样。 – 2013-03-21 21:13:51