R 添加一个 class 到一个字段

R add a class to a field

我在 R 中创建了两个 classes:

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)
}

但是,如果我 运行 我收到了:

assignment of an object of class “Bar” is not valid for @‘bar’ in an object of class “Foo”; is(value, "S4") is not TRUE>

但是,当我打印 Bar 的类型时,我得到的是 S4。我尝试了多种不同的类型,但我的想法很新鲜。

如何将 class 对象分配给变量?

我换了行

bar = "S4"

bar = "Bar"

这似乎解决了问题。

Foo@bar的class应该是Bar,你应该先定义classBar

Bar <- setClass("Bar",
    slots = c(a = "character"),
    prototype=list(a = "qwerty")
    )


Foo <- setClass("Foo", 
    slots = c(bar = "Bar")
    )

请注意,一旦您创建了 foo <- Foo()Foo bar 插槽将 初始化(尝试 str(foo),所以我认为你不需要 addBar 泛型。除非它应该做你描述的其他事情。

此外,如果有的话,那么你应该按如下方式定义你的方法:

setMethod(f="addBar", signature="Foo",
          definition=function(theObject) {
            theObject@bar<- Bar()
           })

(假设您只想用一个空的 Bar() 对象初始化 @bar 槽)。如果你这样做 theObject@bar <- Bar 那么你将 class 生成器函数 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是一个用来生成classfoo新对象的函数。所以 addBar(Foo) 尝试 运行 class classGeneratorFunction 的对象上的 addBar 方法,这可能不是你想要的。