2013-03-21 39 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