我想创建一个几乎是数据框的类,具有一些增强功能(额外功能、额外属性),并且想知道最好的方法是什么。该类基本上是一个数据框,但具有一些附加属性,例如该数据框的架构(以下称为“表单”,自动派生,表示为数据框,用于将数据框转换为正确的类型),和其他几件事。当用户在其他无法识别其特殊类型的函数中使用此对象时,我希望他们处理对象的 data.frame 部分。做这个的最好方式是什么?
我发现的两种方法都不能令人满意;我列出了它们以及我仍然看到并试图解决的问题;问题是:做我想做的事情的最佳方法是什么?
方法 1,使用“data.frame”作为“基础”插槽 (受此 SO 帖子的启发)
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 会话中,以下所有功能都按预期工作。]
但它很快就崩溃了:
nrow(fd) >> NULL
colnames(fd) >> NULL
与上面链接的帖子不同,即使是简单的is.data.frame
也不适合我
is.data.frame >> FALSE
方法二,使用“data”槽(受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, ...)
而不是试图猜测我班级的客户可能使用的所有功能,并将它们定义为dim.formhubData
,names.formhubData
等。
有没有办法实现这样的目标?