这在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
。
我已经通过编辑动物园的来源解决了:我删除了那些...
,但我不明白为什么会这样。任何人都可以解释这里发生了什么?
答案 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
套餐感兴趣,如果您还没有看过它。