R:为‘创建通用函数;拆分’;从包装盒&x2018;基础&x2019;在全球环境中

R:为‘创建通用函数;拆分’;从包装盒&x2018;基础&x2019;在全球环境中,r,generics,split,s4,r-s3,R,Generics,Split,S4,R S3,为简单起见,我将使用以下示例代码:) 我定义了一个S4类测试,然后像往常一样,我采用setMethod为类测试编写通用函数split: # define a S4 class setClass( Class="test", representation=representation( m = "matrix" ) ) # write generic function 'split' for S4 class 'test' setMethod(f = "split", sign

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

我定义了一个S4类
测试
,然后像往常一样,我采用
setMethod
为类
测试
编写通用函数
split

# 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通用方法的形式替换S4类
test
的方法
split
的定义,如下所示,可以消除该信息:


split.test对于S4类来说,这是一个不幸的事实问题。金标准通常被称为
矩阵
包。它们还巧妙地避免了这个问题:重载
行名
列名
(在
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")
再次借用
矩阵
包,一个建议是:

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)
    }
)

这还使用
[
操作符从其他泛型函数中添加了许多自由行为。

我不会把我的家庭农场赌在这上面,但是如果你将定义放入一个R包中,我估计消息会消失。顺便说一句,
suppressMessages()
似乎抑制了该消息。实际上,您根本不需要定义
拆分
方法。只需为
[
拆分定义一个方法即可。默认值将处理其余部分。
> `[`
.Primitive("[")
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)
    }
)