正确的方法来访问r中的类槽

时间:2015-12-22 18:12:42

标签: r

我定义了一个具有数据帧槽df的类,它可以通过方法doAnalysis访问。

setClass(Class='E166Hist',representation=representation(df='data.frame'), contains='ImmutableAnalysis')

setGeneric(name='doAnalysis', def=function(x){standardGeneric('doAnalysis')})

setMethod(f='doAnalysis', signature='E166Hist', definition=function(x){
    tmp<-melt(x@df, variable.name='source', value.name='pc')})

当我打电话

dh<-new(Class='E166Hist')
doAnalysis(dh)

我在varnames [离散]中得到错误:无效的下标类型&#39; list&#39;这似乎是由x @ df引起的。如果我用df替换x @ df,它可以正常工作。我很困惑,因为我认为@需要访问类的插槽。如果有人能解释我在这里失踪的东西,我会很感激。谢谢!

2 个答案:

答案 0 :(得分:2)

这里更容易再现错误

> melt(data.frame(), variable.name="source")
Error in varnames[discrete] : invalid subscript type 'list'

它表明问题是data.frame没有名为source

的列
> melt(data.frame(source=character()), variable.name="source")
Using source as id variables
[1] source
<0 rows> (or 0-length row.names)

这似乎让我们开始了,所以使用你的类(省略继承关系并使用setClass()返回的生成函数)

.E166Hist <- setClass(Class='E166Hist', representation(df='data.frame'))

setGeneric('doAnalysis', function(x) standardGeneric('doAnalysis'))

setMethod('doAnalysis', 'E166Hist', function(x) {
    melt(x@df, variable.name='source', value.name='pc')
})

当对象的data.frame()没有列

时,我们会重现错误
> doAnalysis(.E166Hist())
Error in varnames[discrete] (from #2) : invalid subscript type 'list'

但不是当它有列

> result = doAnalysis(.E166Hist(df=data.frame(source=character())))
Using source as id variables
> result
[1] source
<0 rows> (or 0-length row.names)
>

答案 1 :(得分:0)

好的,@ martin-morgan,df没有正确初始化。添加初始化使其按预期工作:

setClass(Class='E166Hist', representation(df='data.frame'))
setGeneric('doAnalysis', function(x) standardGeneric('doAnalysis'))

setMethod('doAnalysis', 'E166Hist', function(x) {
melt(x@df, variable.name='source', value.name='pc')})

setMethod('initialize','E166Hist',
function(.Object) {.Object@df=data.frame(source=character()); .Object})

.E166Hist<-new ('E166Hist')

现在doAnalysis完成了这项工作:

doAnalysis(.E166Hist)
Using source as id variables
[1] source  
<0 rows> (or 0-length row.names)