gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:44:04 26 4
gpt4 key购买 nike

为标题道歉,不知道如何表达这个问题。

如果我想创建 setMethod在一个类(class)上如何区分mat[i,]的类似情况和 mat[i] ?

我知道我可以使用的前者:

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

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

看着 ?[我希望类似以下内容的文档会起作用:
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

最佳答案

您会在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com