我定义了一个具有数据帧槽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,它可以正常工作。我很困惑,因为我认为@需要访问类的插槽。如果有人能解释我在这里失踪的东西,我会很感激。谢谢!
答案 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)