gpt4 book ai didi

r - R中非列表类的继承?

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

在 R 中,继承可以通过以下方式扩展基于列表的类来实现:假设 lmo 是从线性模型拟合获得的类 lm 的对象。该类可以简单地扩展为:

x <- rnorm(1000)
y <- rexp(1000)
lmo <- lm(x~y)

lmo$addition <- "some more information"
class(lmo) <- c("lmext","lm")

我仍然可以使用所有适用于 lm 的方法,例如 summary.lm,但也可以定义自定义方法。显然,在很多情况下,您希望只添加最少的内容,但仍希望能够使用父类中的所有方法。

为不基于列表的类添加附加属性和实现方法继承的最佳方法是什么,例如时间序列?这是我能想到的:

ts1 <- ts(rnorm(100),start = c(1990,1),frequency = 4)
attr(ts1,"additional") <- "some more information"
class(ts1) <- c("tsext","ts")

print.tsext <-
# some method that uses the original print method for ts, plus extracts
# the additional information

这是实现 + 等运算符的好方法吗?无需重新定义新类的所有内容即可继续工作?有更好的东西吗?有没有办法在不重新定义所有基本运算符的情况下将两个系列相互添加时保留附加类/属性?

最佳答案

这是基本函数删除额外 S3 类的问题:

> foo=1:10
> class(foo)
[1] "integer"
> class(foo)=c("thing","integer")
> class(foo[1:4])
[1] "integer"

但是 Date 是如何绕过这个的呢?

> dv = as.Date(c("2013-01-01","2013-02-02","2013-02-02","2013-02-06"))
> class(dv)
[1] "Date"
> class(dv[2:3])
[1] "Date"

当然,通过为 Date 类重新定义 [:

> get("[.Date")
function (x, ..., drop = TRUE)
{
cl <- oldClass(x)
class(x) <- NULL
val <- NextMethod("[")
class(val) <- cl
val
}

您可能会注意到,此方法实际上根本没有在其代码中提及 Date - 它只是获取旧类,调用默认下标方法,然后重新分配原始类。为什么这不是默认行为是一个谜,但这确实意味着如果你想创建一个基于向量的新类,你只需复制这个函数作为你的新子集方法。

这是我所知道的关于在 R 中创建子类的问题的最简单的例子。这个答案的其余部分将显示更多的危险,我会尽量不要在这个过程中变得过于粗暴。我认为这与您的问题完全相关。

但遗憾的是,非基类在 R 代码中被滥用很多,您最终将不得不编写一堆其他相当“通用”的方法来使您的类工作:

> d = data.frame(f=foo,x=1:10)
Error in as.data.frame.default(x[[i]], optional = TRUE) :
cannot coerce class ""thing"" to a data.frame

所以现在你必须写as.data.frame.thing,幸运的是它可以和as.data.frame.Date

一样
> as.data.frame.thing = as.data.frame.Date
> d = data.frame(f=foo,x=1:10)
> d

太好了,现在您已经在数据框中得到了您的 thing 类。

然后有一天,您将尝试使用数据框中您的类的向量对 dplyr 做一些事情,然后您会吐口水:

> d %.% group_by(f) %.% summarise(m=mean(x))
Error in eval(expr, envir, enclos) : column 'f' has unsupported type

但是 dplyrDate 对象一起工作对吗?这是因为在 C++ 代码的深处,它会检查 Date 类型。此时你感到绝望。

这些只是编写从现有类继承的 S3 类的一些陷阱。基本上,某些东西不会 正常工作,至少不会以您在使用另一种语言的 OOP 方面的经验时所期望的方式工作。

关于r - R中非列表类的继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25600766/

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