在包中使用 cbind、rbind 和 s4 类 的正确方法
Proper way to use cbind, rbind with s4 classes in package
我已经使用 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 帮助页面在历史上是准确的,但最近不是。这是 class
.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"
这很好,只要“...”参数相同(可能派生)class,这通常就足够了。
> cbind(.A(), integer())
[,1]
[1,] ?
我相信 bind_activation()
具有全球影响,而不仅仅是在您的包裹中发货;应该避免使用它(例如,它不再用于 Matrix 包中)。
此外,我认为这已在 R-devel 中更新
r67699 | lawrence | 2015-02-01 10:13:23 -0800 (Sun, 01 Feb 2015) | 4
lines
cbind/rbind now delegate recursively to cbind2 (rbind2) when at least
one argument is an S4 object and S3 dispatch fails; also consider S4
inheritance during S3 dispatch in the *bind functions.
我已经使用 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 帮助页面在历史上是准确的,但最近不是。这是 class
.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"
这很好,只要“...”参数相同(可能派生)class,这通常就足够了。
> cbind(.A(), integer())
[,1]
[1,] ?
我相信 bind_activation()
具有全球影响,而不仅仅是在您的包裹中发货;应该避免使用它(例如,它不再用于 Matrix 包中)。
此外,我认为这已在 R-devel 中更新
r67699 | lawrence | 2015-02-01 10:13:23 -0800 (Sun, 01 Feb 2015) | 4 lines
cbind/rbind now delegate recursively to cbind2 (rbind2) when at least one argument is an S4 object and S3 dispatch fails; also consider S4 inheritance during S3 dispatch in the *bind functions.