正确的方式使用cbind,包含s4类的rbind
我已经使用S4类编写了一个包,并希望使用这些定义的类的函数rbind,cbind。
由于似乎无法将rbind
和cbind
直接定义为S4方法,我改为定义了rbind2
和cbind2
:
setMethod("rbind2", signature(x="ClassA", y = "ANY"),
function(x, y) {
# Do stuff ...
})
setMethod("cbind2", signature(x="ClassA", y = "ANY"),
function(x, y) {
# Do stuff ...
})
从?cbind2
我了解到,这些函数需要使用methods:::bind_activation
来激活,以从base中取代rbind和cbind。
我使用.onLoad
函数将该调用包含在包文件R / zzz.R中:
.onLoad <- function(...) {
# Bind activation of cbind(2) and rbind(2) for S4 classes
methods:::bind_activation(TRUE)
}
这按预期工作。 但是,运行R CMD检查我现在得到以下说明,因为我在方法中使用未导出的函数:
* checking dependencies in R code ... NOTE
Unexported object imported by a ':::' call: 'methods:::bind_activation'
See the note in ?`:::` about the use of this operator.
我怎样才能摆脱这个NOTE,以及在包中为S4类定义方法cbind和rbind的正确方法是什么?
我认为Matrix软件包中的cBind帮助页面基本上历史上是准确的,但不是最近。 这是一堂课
.A = setClass("A", representation(x="numeric"))
没有通用的,所以创建一个,发送'...'参数(参见?setMethod
和?dotsMethods
)
getGeneric("cbind")
## NULL
setGeneric("cbind", signature="...")
## Creating a new generic function for 'cbind' in the global environment
然后实施一种方法
setMethod("cbind", "A", function(..., deparse.level=1) "cbind,A-method")
## [1] "cbind"
最后使用它
> cbind(.A(), .A())
[1] "cbind,A-method"
只要'...'参数是相同的(可能派生的)类,这是很好的,这通常足够好。
> cbind(.A(), integer())
[,1]
[1,] ?
我相信bind_activation()
具有全局效果,而不仅仅是在你的包中发送; 应该避免它(例如,它不再用于Matrix包中)。
另外,我认为这已经在R-devel中进行了更新
r67699 | 劳伦斯| 2015-02-01 10:13:23 -0800(Sun,2015年2月1日)| 4行
当至少有一个参数是S4对象且S3调度失败时,cbind / rbind现在递归地委托给cbind2(rbind2) 还要考虑S3绑定期间在* bind函数中的S4继承。
链接地址: http://www.djcxy.com/p/83021.html上一篇: Proper way to use cbind, rbind with s4 classes in package
下一篇: Accessing function object's properties from inside the function body