对标题表示歉意,不知道该如何用其他方式表达这个问题。
如果要在类上创建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))
)
但它与缺少
j
和drop
的任何以前定义的方法相冲突。这个想法和
mat <- matrix(seq(9), 3, 3)
mat[c(1,3),]
1 4 7
3 6 9
mat[c(1,3)]
[1] 1 3
最佳答案
您将在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
。基本上,您必须重新实现已经存在的功能。关于R S4 setMethod '['区分缺少的参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37597266/