0

私が作成した別の関数を使用して、特定の情報が読み込まれた非常に特定の行列を取る関数がいくつかあります。現在、関数が受け入れる行列は、通常の 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つの次元があることが示されます。もう1つの奇妙なことは、私がそうした場合、colnames(mat2)それらが返されることです. ただし、個々の列の colname を見つけようとすると、たとえばcolname(mat2[,4])、返される値はNULL. これがなぜなのか、または私が何をすべきかを誰でも説明できますか?私は本当にそれを基本的にマトリックスにしたいのですが、関数は何をどのくらいの大きさのマトリックスに関して非常に具体的である必要があるため、別のクラスとして定義するとエラーと入力のチェックが非常に簡単になり、R のメソッド メカニズムを使用できるようになり、すべてのカスタム プロット関数を plot() のメソッドにすることができます。

4

2 に答える 2

1

変更する必要があります

class(x) <- "sdpmgdna"

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

そうすれば、Rは最初にクラスメソッドを検索し、見つからない場合は行列メソッドを使用します

于 2013-03-13T18:01:14.727 に答える
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
于 2013-03-13T17:49:37.813 に答える