我在R中创建了两个类:
library(methods)
Foo <- setClass(
# Set the name for the class
"Foo",
# Define the slots
slots = c(
# THIS IS PROBABLY WRONG
bar = "S4"
),
)
还有
Bar <- setClass(
# Set the name for the class
"Bar",
# Define the slots
slots = c(
a = "character"
),
# Set the default values for the slots. (optional)
prototype=list(
a = "qwerty"
),
)
我想说些Foo.bar <- Bar()
。我认为应该这样做:
# create a method to assign the value of a coordinate
setGeneric(name="addBar",
def=function(theObject)
{
standardGeneric("addBar")
}
)
setMethod(f="addBar",
signature="Foo",
definition=function(theObject)
{
theObject@bar<- Bar
}
)
然后我使用以下命令调用它:
if (!interactive()) {
result <- tryCatch({
foo <- Foo()
foo <- addBar(Foo)
}
,
warning = function(war) {
print('A warning occurred')
print(war)
},
error = function(err){
print('An error occurred')
print(err)
}
)
print(result)
}
但是,如果我运行此程序,则会受到欢迎:
对于“ Foo”类的对象中的@“ bar”,分配“ Bar”类的对象无效; is(value,“ S4”)不是TRUE>
但是,当我打印Bar的类型时,我得到了S4。我尝试了多种不同的类型,但是我对这些想法一无所知。
如何为变量分配类对象?
答案 0 :(得分:1)
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
方法,这可能不是您想要的。
答案 1 :(得分:0)
我更改了行
bar = "S4"
收件人
bar = "Bar"
这似乎解决了问题。