Класс Foo@bar
должен быть, вероятно, Bar
, и вы должны сначала определить класс Bar
:
Bar <- setClass("Bar",
slots = c(a = "character"),
prototype=list(a = "qwerty")
)
Foo <- setClass("Foo",
slots = c(bar = "Bar")
)
Обратите внимание, что после создания foo <- Foo()
, bar
Слот Foo
будет уже инициализирован (попробуйте str(foo)
, поэтому я думаю, что вам не нужен универсальный addBar
. Если только он не должен делать что-то другое, чем то, что вы описываете.
Кроме того, если что, вы должны определить свой метод следующим образом:
setMethod(f="addBar", signature="Foo",
definition=function(theObject) {
theObject@bar<- Bar()
})
(при условии, что все, что вам нужно, это инициализировать слот @bar
пустым объектом Bar()
Если вы делаете theObject@bar <- Bar
, то вы назначаете функцию генератора классов Bar
на слот @bar
и получаете сообщение об ошибке:
Error in (function (cl, name, valueClass) :
assignment of an object of class “classGeneratorFunction” is not
valid for @‘bar’ in an object of class “Foo”; is(value, "Bar") is not TRUE
Наконец, обратите внимание, что вызов
foo <- addBar(Foo)
не делает то, что вы думаете. Foo
- это функция, используемая для генерации новых объектов класса foo
. Поэтому addBar(Foo)
пытается запустить метод addBar
для объекта класса classGeneratorFunction
что, вероятно, не то, что вы хотели.