正确使用cbind的方法,rbind包中的s4类

时间:2015-01-11 11:31:00

标签: r package s4

我已经使用S4类编写了一个包,并希望使用函数rbind,cbind和这些定义的类。

由于似乎无法直接将rbindcbind定义为S4方法,我改为定义rbind2cbind2

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激活这些函数以从基础替换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的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

我认为基本上Matrix包中的cBind帮助页面在历史上是准确的,但不是最近的。这是一个班级

.A = setClass("A", representation(x="numeric"))

没有通用的,所以创建一个,派遣&#39; ...&#39;参数(参见?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"

只要&#39; ...&#39;这很好。参数是相同的(可能是派生的)类,这通常是足够好的。

> cbind(.A(), integer())
     [,1]
[1,] ?  

我相信bind_activation()会产生全局影响,而不仅仅是在你的包中发送;应该避免它(例如,它不再在Matrix包中使用)。

另外,我认为这已经在R-devel中更新了

  
     

r67699 |劳伦斯| 2015-02-01 10:13:23 -0800(2015年2月1日,星期日)| 4   线

     

cbind / rbind现在至少在递归时委托给cbind2(rbind2)   一个参数是S4对象,S3调度失败;还考虑S4   在* bind函数中的S3调度期间继承。