2016-10-18 7 views
6

は「非公開に」メソッド私はいくつかのカスタムクラスを持って、例えば:R - カスタムクラスのリスト

setClass("foo", slots = c(mat = "matrix")) 

私はfooオブジェクトのリストが「非公開」されている方法を扱うようにしたいです。

mat <- matrix(rnorm(16), 4) 
foo <- new("foo", mat = mat) 
unlist(list(foo)) 

Iは、おそらく(私は間違って、おそらく使用されたと思ったが、これは)cための方法を作成し、unlistする問題を解決するだろうと思いました。

S3バージョン

#' @export 
unlist <- function(x, ...) UseMethod("unlist", x) 

#' @export 
unlist.default <- base::unlist 
#' @method unlist foo 
#' @export 
unlist.foo <- function(x, ...){ 
    print("called foo unlist") 
} 

S4バージョン

#' @export 
setMethod("unlist", 
      signature = "foo", 
      function(x, recursive = TRUE, use.names = TRUE){ 
      print("call foo unlist") 
      }) 

c機能

#' @export 
setMethod("c", 
      signature = "foo", 
      function(x, ..., recursive = FALSE){ 
      print("called foo c") 
}) 

しかし、私は直接cを使用するとき、私は唯一の確認メッセージを参照してください。

c(foo) 
[1] "called foo c" 

unlistちょうどなし印刷メッセージ

と同じオブジェクトを返します
unlist(list(foo)) 
[[1]] 
An object of class "foo" 
Slot "mat": 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.6711541 -0.2783441 -0.4707375 -0.23060105 
[2,] 0.7408401 0.4076826 2.2757187 -0.48547413 
[3,] 1.8640581 0.3610619 -0.4632473 -0.06498348 
[4,] -0.5595930 0.6679157 -0.8142456 0.27499963 

私はunlist(foo)を呼び出す場合、私は、印刷メッセージが表示されますが、私はfooオブジェクトのリストにそれを適用する必要があります。どのように私はリスト内のカスタムクラスに対処することができますか?

最終的に私は次のようにTRUEを返すようにしたい:

all.equal(unlist(list(foo)), unlist(list(mat))) 
+1

'unlist'はS3メソッドのようには見えません。あなたの関数を使いたいのであれば、 'unlist.foo'を直接呼び出す必要があります。 – Chrisss

+0

@Chrisss私は' roxygen2'を使ってS3としてエクスポートしましたが、S3として明示的に 'unlist'をインスタンス化しました。それでも同じ問題が発生します。 – cdeterman

+0

'unlist。foo'はS3のメソッドとなります。これは 'foo < - structure(matrix(rnorm(16)、4)、class =" foo ")'などのオブジェクトに適用されますが、間違いではない。 – baptiste

答えて

0

私はこれができないかと思います。 unlistは、取得するリストの個々の要素のタイプに基づいて出力のタイプを決定します。唯一の要素がfoo(行列)の場合のように、すべての要素がアトミックである場合、その引数に何かを行います。共通のアトミックベクトル(1つしかありません)への引数を強制し、ほとんどの属性(例:次元)を忘れます。しかし、原子ベクトルに基づくS4オブジェクト(fooのような)は原子ベクトルとして扱われません。その結果、これらのS4オブジェクトは結果としてそのまま残され、結果は型リストになります。だからをlist(foo)に呼び出すと、list(foo)が返されます。この動作はC言語(do_unlistbind.c)で実装されており、ドキュメントに沿っているようです。 unlistの可能な用途のサブセットで所望の動作を模倣する

、1はおそらく、fooオブジェクトのリストのための新しいクラスを実装fooためlistを定義し、このリストの-fooのための新しいunlistを定義することができますクラスは、unlistのデフォルトのC実装が原子ベクトルのリスト上でどのように動作するか(これは試していません)と同様に動作します。