使用NextMethod覆盖R中的方法

时间:2010-08-06 12:17:09

标签: oop r

这在R中如何运作......

我正在使用一个包(动物园1.6-4)来定义时间序列集的S3类。 我正在编写一个派生类,我想覆盖一些方法,但不能超越这个方法:[.zoo

在我的派生类行中的

是按时间戳索引的,就像在动物园中一样,但与动物园不同,我只允许索引中的POSIXct值。我的用户将一直选择列,而只是偶尔切片系列,所以我想提供obj[name]而不是obj[, name]

我的对象有类c("delftfews", "zoo")

但是...

如何覆盖方法?

我试过了:

"[.delftfews" <- function(x, i, j, drop=TRUE, ...) {
  if (missing(i)) return(NextMethod())
  if (all(class(i) == "character") && missing(j)) {
    return(NextMethod('[', x=x, i=1:NROW(x), j=i, drop=drop, ...))
  }
  NextMethod()
}

但我收到此错误:Error in rval[i, j, drop = drop., ...] : incorrect number of dimensions

我已经通过编辑动物园的来源解决了:我删除了那些...,但我不明白为什么会这样。任何人都可以解释这里发生了什么?

2 个答案:

答案 0 :(得分:2)

问题在于,使用上述[.delftfews此代码的定义:

library(zoo)
z <- structure(zoo(cbind(a = 1:3, b = 4:6)), class = c("delftfews", "zoo"))
z["a"]
# generates this call: `[.zoo`(x = 1:6, i = 1:3, j = "a", drop = TRUE, z, "a")

如果您编写如下呼叫,您的代码将按原样运行:

z[j = "a"]
# generates this call: `[.zoo`(x = z, j = "a")

我认为您想要的是将[.delftfews中的相关行更改为:

return(NextMethod(.Generic, object = x, i = 1:NROW(x), drop = drop))
# z["a"] now generates this call: `[.zoo`(x = z, i = 1:3, j = "a", drop = TRUE)

答案 1 :(得分:0)

澄清一点:仅允许POSIXct索引值不允许仅按名称索引列。我不确定你是如何得出这个结论的。

你正确地压倒了动物园,但我认为你误解了NextMethod。该错误是由if (missing(i)) return(NextMethod())引起的,如果[.zoo丢失则会调用i,但[.zoo需要i,因为动物园的内部数据结构是一个矩阵。这样的事情应该有效:

if (missing(i)) i <- 1:NROW(x)

虽然我不确定您是否必须明确地将此新i传递给NextMethod ...

您可能对xts套餐感兴趣,如果您还没有看过它。