R:为‘创建通用函数;拆分’;从包装盒&x2018;基础&x2019;在全球环境中
为简单起见,我将使用以下示例代码:) 我定义了一个S4类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
测试
,然后像往常一样,我采用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)
}
)