2

为简单起见,我将使用以下示例代码:)

我已经定义了一个 S4 类test,然后像往常一样,我采用为类setMethod编写通用函数:splittest

# define a S4 class
setClass(
  Class="test",
  representation=representation(
   m = "matrix"
  )
)

# write generic function 'split' for S4 class 'test'
setMethod(f = "split", signature = c("test"), function(x, f) {
  split(x@m, f)
})

# call generic function for test
split(new("test", m=matrix(1:9,3)), c(1,2,3))

运行上面的代码,R命令行会给出如下信息:

在全局环境中从包“base”中为“split”创建通用函数

然后程序输出如下:

$`1`
[1] 1 4 7

$`2`
[1] 2 5 8

$`3`
[1] 3 6 9

看来输出是正确的。但我的问题是如何抑制消息:

在全局环境中从包“base”中为“split”创建通用函数

非常感谢 :)

PS: 我发现用我们如何实现 S3 泛型方法的形式替换splitS4 类的方法定义,如下所示,可以消除该消息test

split.test <- function(x, f) {
  split(x@m, f)
}

但是,我认为混合 S3 和 S4不是一个好主意 :)

4

1 回答 1

1

这是 S4 课程的一个不幸的事实问题。黄金标准通常被称为Matrix包。他们还巧妙地避免了这个问题:重载rownamescolnames(定义在base)直接产生相同的警告。但是检查这些函数会发现它们是函数的便利dimnames函数:

> colnames
function (x, do.NULL = TRUE, prefix = "col")
{
    if (is.data.frame(x) && do.NULL)
        return(names(x))
    dn <- dimnames(x)
# ...
}
> rownames
function (x, do.NULL = TRUE, prefix = "row")
{
    dn <- dimnames(x)
# ...
}
> dimnames
function (x)  .Primitive("dimnames")

Matrix包通过定义一个针对dimnames. 正如迈克尔上面评论的那样,您最好的选择是重载[运算符,这同样是原始的:

> `[`
.Primitive("[")

再次从包中借用Matrix,一个建议是:

setMethod("[", signature(x = "sparseMatrix", i = "missing", j = "index",
             drop = "logical"), 
    function(x, i, j, ..., drop) {
       # add any behavior for ...
       `[`(x@m, i, j, drop=drop)
    }
)

这也为使用操作符的其他通用函数添加了许多自由行为[

于 2019-02-25T11:28:08.247 回答