R S4 setMethod '[' 区分缺少的参数?
R S4 setMethod '[' distinguish missing argument?
对标题表示歉意,不知道如何表达这个问题。
如果我想在 class 上创建 setMethod
,我如何区分 mat[i,]
和 mat[i]
的相似情况?
我知道前者我可以使用:
setMethod("[",
signature(x = "foo", j = "missing", drop = "missing"),
function(x,i,j,drop) return(myFunc(x,i))
)
如何设置一种方法来区分后者,我不想 select 行,而是 base
matrix
class 中的元素?
查看 ?[
文档,我预计类似以下内容会起作用:
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 并为矩阵实现新的 classes 和方法。据我所知,无法在签名中声明您要查找的内容。相反,您必须使用函数 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]
但是,如果您直接扩展基础 class 'matrix'(或 Matrix 包中的 'Matrix')并执行类似
的操作,会更容易
setClass("Matrix", contains = "matrix")
既然你免费获得了这些方法。请注意,例如,在上面的实现中,您仍然需要处理参数 drop
。基本上你必须重新实现已经存在的东西。
对标题表示歉意,不知道如何表达这个问题。
如果我想在 class 上创建 setMethod
,我如何区分 mat[i,]
和 mat[i]
的相似情况?
我知道前者我可以使用:
setMethod("[",
signature(x = "foo", j = "missing", drop = "missing"),
function(x,i,j,drop) return(myFunc(x,i))
)
如何设置一种方法来区分后者,我不想 select 行,而是 base
matrix
class 中的元素?
查看 ?[
文档,我预计类似以下内容会起作用:
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 并为矩阵实现新的 classes 和方法。据我所知,无法在签名中声明您要查找的内容。相反,您必须使用函数 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]
但是,如果您直接扩展基础 class 'matrix'(或 Matrix 包中的 'Matrix')并执行类似
的操作,会更容易setClass("Matrix", contains = "matrix")
既然你免费获得了这些方法。请注意,例如,在上面的实现中,您仍然需要处理参数 drop
。基本上你必须重新实现已经存在的东西。