2013-03-13 80 views
0

我有一些函數需要使用我已經創建的另一個函數載入特定信息的特定矩陣。目前函數接受的矩陣是正常的R矩陣類型。不過,我想將它們分配爲不同的類型或類,以便實現簡單的輸入檢查,以便用戶不能將任何矩陣放入函數中。在R中爲矩陣創建一個新的類

我想看到在網上的幾個例子後,S3方法很容易:

mat1 <- matrix(c(1:10),ncol=5) 

colnames(mat1) <- c("ONE","TWO","THREE","FOUR","FIVE") 

as.sdpmgdna <- function(x) { 
    class(x) <- "sdpmgdna" 
    return(x) 
} 

mat2 <- as.sdpmgdna(mat1) 

這似乎在迄今爲止的工作,如果我回到MAT2我看到一個矩陣,如果我把它叫做通過indecies mat2 [1,2]我得到我應該得到的正確值。然而,我不能確定有些事情已經改變 - 它現在被描述爲sdpmgdna [10],即它似乎忽略它有2個維度,儘管做上面的事情並在屏幕上打印mat2顯示它顯然確實有2個維度。另一個奇怪的是,如果我做colnames(mat2)他們返回。但是,如果我嘗試查找單個列的列名,例如colname(mat2[,4])則返回的值是NULL。任何人都可以解釋爲什麼這是或者我應該做什麼 - 我真的希望它基本上是一個矩陣,但是因爲函數要求它對於什麼和多大的矩陣非常具體,將它定義爲另一個類會使錯誤和輸入檢查更容易 - 並允許我使用R的方法機制,因此我所有的自定義繪圖函數都可能只是plot()的方法。

+1

你應該從'matrix'繼承''參見''class''。 '而不是'colnames(mat2 [,4])',嘗試'colnames(mat2)[4]'或'colnames(mat2 [,4,drop = FALSE])''。 – Gregor 2013-03-13 17:41:36

+0

繼承部分很簡單:'class(x)< - c(class(x),「sdpmgdna」)'。我想補充一句,「sdpmgdna」對於一個班級來說是一個非常糟糕的名字 - 很難說出它可能意味着什麼。 – 2013-03-13 18:35:36

回答

1

如果使用colnames普通矩陣的各個列,你還可以得到NULL

colnames(mat1[,1]) 
NULL 
dim(mat1[,1]) 
NULL 
dim(mat1[,1,drop=FALSE]) 
[1] 2 1 
colnames(mat1[,1,drop=FALSE]) 
[1] "ONE" 

另一個問題是,作爲新的矩陣沒有matrix類,方法,這就需要類matrix億韓元的對象」工作。不如也matrix給作爲類屬性:

isSymmetric(mat2) 
Error in UseMethod("isSymmetric") : 
    no applicable method for 'isSymmetric' 
    applied to an object of class "sdpmgdna" 
class(mat2)<-c("sdpmgdna","matrix") 
isSymmetric(mat2) 
[1] FALSE 

需要注意的是,即使沒有矩陣類的一些工作的事情如:

class(mat2)<-c("sdpmgdna") 
is.matrix(mat2) 
[1] TRUE 
1

你應該改變

class(x) <- "sdpmgdna" 

class(x) <- c("sdpmgdan", "matrix") 

這樣R首先搜索你的類的方法,如果沒有找到它們,它將使用矩陣方法

+1

如果您將'as.sdpmgdan'函數應用於非矩陣,您可能需要使用'class(x)< - c(class(x),「sdpmgdan」)'。 – 2013-03-13 18:37:57