R добавить класс в поле - PullRequest
1 голос
/ 11 июля 2019

Я создал два класса в 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)
}

Однако, если я запускаю это, меня приветствуют:

присвоение объекта класса «Bar» недопустимо для @ 'bar' в объекте класса «Foo»;is (значение, "S4") не TRUE>

Однако, когда я печатаю тип Bar, я получаю S4.Я пробовал несколько разных типов, но у меня нет идей.

Как назначить объект класса переменной?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Класс 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что, вероятно, не то, что вы хотели.

0 голосов
/ 11 июля 2019

Я изменил строку

bar = "S4"

Для

bar = "Bar"

Кажется, это решает проблему.

...