R将类添加到字段

时间:2019-07-11 12:30:13

标签: r types s4

我在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。我尝试了多种不同的类型,但是我对这些想法一无所知。

如何为变量分配类对象?

2 个答案:

答案 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"

这似乎解决了问题。