gpt4 book ai didi

r - 如何创建具有附加功能的 data.frame 子类

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

我想创建一个几乎是数据框的类,具有一些增强功能(额外功能、额外属性),并且想知道最好的方法是什么。该类基本上是一个数据框,但具有一些附加属性,例如该数据框的架构(以下称为“表单”,自动派生,表示为数据框,用于将数据框转换为正确的类型),和其他几件事。当用户在其他无法识别其特殊类型的函数中使用此对象时,我希望他们处理对象的 data.frame 部分。做这个的最好方式是什么?

我发现的两种方法都不能令人满意;我列出了它们以及我仍然看到并试图解决的问题;问题是:做我想做的事情的最佳方法是什么?

方法一,使用“data.frame”作为“base”槽 (inspired by this SO post)

setClass("formhubData", representation(form="data.frame"), contains="data.frame")
fd <- new('formhubData', data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))

此方法允许我执行以下操作:
fd$x                  >> 1 2
names(fd) >> "x"

[更新:原来“崩溃”是由我的环境引起的,我在其中使用不同的参数反复调用 setClass('formhubData', ...) 。在新的 R session 中,以下所有函数都按预期工作。]

但它很快就崩溃了:
nrow(fd)              >> NULL
colnames(fd) >> NULL

与上面链接的帖子不同,即使是简单的 is.data.frame不适合我
is.data.frame         >> FALSE

方法二,使用“数据”槽 (灵感来自 SP)
setClass("formhubData", representation(data="data.frame", form="data.frame"))
fd <- new('formhubData', data=data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))

我失去了默认定义:
fd$x             >> NULL
names(fd) >> integer(0)

但是,至少我可以重新定义它们中的大多数(仍然需要了解 [、[[ 等):
 dim.formhubData <- function(x) dim(x@data)
names.formhubData <- function(x) names(x@data)
nrow(fd) >> 2
names(fd) >> "x"

但是,我似乎无法表达这样一个事实,即对于任何采用 data.frame 的方法,我的类都应该用作其 @data 插槽的传递。我觉得需要像 *.formhubData <- function(x, ...) *(x, ...) 这样的东西而不是试图猜测我类(class)的客户可能使用的所有功能,并将它们定义为 dim.formhubData , names.formhubData , ETC。

有没有办法实现这样的目标?

最佳答案

虽然这两种方法在某种程度上都有效,但我实际上建议方法 2。关于“is-a”与“has-a”设计的“标准”面向对象的考虑通常会支持“has-a”。此外,在 R 中,方法可以随时添加到对象中,因此在某些方面,“is-a”是在宣传对您的类执行任意数量的任意事情是有意义的。这是一个很难履行的契约,即使对于像子设置这样的定义功能 - 大概是如果用户将行或列删除/添加到底层 dataformhubData ,您想更新 form 中的信息.

相反,您似乎真的很想实现“具有”关系,并利用这个机会将接口(interface)限制为有意义的操作。您仍然可以通过简单的分派(dispatch)到底层实现,以最少的新代码获得大量的代码重用,例如,

setMethod(dim, "formhubData", function(x) dim(x@data)

给你 nrowncol , 例如。对于常见操作(例如,子集),您希望提供尊重数据结构完整性的实现。如果确实是用户应该能够做几乎任意的事情,你可以提供简单的“访问器”到 data。 , 也许使用 setter 来做任何需要带来 form字段与用户提供的更新后的 data.frame 一致。

关于r - 如何创建具有附加功能的 data.frame 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16387939/

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