R S4 setMethod'['区分缺失的参数?

时间:2016-06-02 16:24:36

标签: r oop s4

为标题道歉,不知道怎么说这个问题。

如果我想在课堂上创建setMethod,我如何区分mat[i,]mat[i]的类似案例?

我知道前者我可以使用:

setMethod("[",
    signature(x = "foo", j = "missing", drop = "missing"),
    function(x,i,j,drop) return(myFunc(x,i))
)

如何在base matrix类中设置一种方法来区分后者,我不想选择行而是选择元素?

查看?[文档,我期望以下内容可行:

setMethod("[",
    signature(x = "foo", i = "numeric"),
    function(x,i,j,drop) return(myFunc(x,i))
)

但它与之前定义的jdrop缺失的方法相冲突。

这个想法与

相同
mat <- matrix(seq(9), 3, 3)

mat[c(1,3),]
1 4 7
3 6 9

mat[c(1,3)]
[1] 1 3

1 个答案:

答案 0 :(得分:4)

你会在Matrix包中找到很多例子。它使用S4并为矩阵实现新的类和方法。据我所知,没有办法在签名中声明你要找的东西。相反,您必须使用函数nargs来区分mat[1]mat[1, ]。以下是如何执行此操作的示例:

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

setMethod(
  "[",
  signature(x = "foo", i = "missing", j = "missing", drop = "missing"),
  function(x, i, j, drop = FALSE) {
    x
  }
)

setMethod(
  "[",
  signature(x = "foo", i = "numeric", j = "missing", drop = "missing"),
  function(x, i, j, ..., drop) {
    if (nargs() == 3) x@mat[i, ]
    else x@mat[i]
  }
)

setMethod(
  "[",
  signature(x = "foo", i = "numeric", j = "numeric", drop = "missing"),
  function(x, i, j, ..., drop) {
    x@mat[i, j]
  }
)

mat <- new("foo", mat = matrix(seq(9), 3, 3))

mat[]
mat[2:5]
mat[1:2, ]
mat[1:2, 2]

但是,如果直接扩展基类'matrix'(或Matrix包中的'Matrix')并执行类似

的操作会更容易
setClass("Matrix", contains = "matrix")

因为你免费获得这些方法。请注意,例如,在上面的实现中,您仍然需要处理参数drop。基本上你必须重新实现已有的东西。