gpt4 book ai didi

r - 在包中使用 cbind、rbind 和 s4 类的正确方法

转载 作者:行者123 更新时间:2023-12-04 12:31:11 25 4
gpt4 key购买 nike

我已经使用 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 激活从 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 | 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.

关于r - 在包中使用 cbind、rbind 和 s4 类的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27886535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com