R добавить класс в поле

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

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

присвоение объекта класса «Бар» недопустимо для @«бар» в объекте класса «Фу»; is(значение, "S4") НЕ ИСТИНА>

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

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


person Nathan    schedule 11.07.2019    source источник


Ответы (2)


Класс 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, что, вероятно, не то, что вам нужно.

person January    schedule 11.07.2019
comment
Большое спасибо за ваш ответ. Я новичок в R и действительно борюсь. Мое конкретное намерение состоит в том, чтобы импортировать объект класса из другого файла (bar) и сделать мою переменную этого типа объекта в моем исходном классе (foo). Вы говорите, что я сначала должен определить bar перед определением foo, значит ли это, что мое намерение невозможно? - person Nathan; 11.07.2019
comment
Что вы имеете в виду под другим файлом? Кроме того, означает ли это, что Bar уже определен в другом месте? Тогда вам вообще не нужно определять Bar. Возможно, вы должны быть более конкретными в своем вопросе относительно того, чего именно вы пытаетесь достичь. - person January; 11.07.2019
comment
У меня есть два файла. В моем первом файле у меня есть Foo. Foo импортирует файл, в котором определен Bar, и создает переменную bar. Моя цель - скопировать функциональность динамического импорта из python. - person Nathan; 11.07.2019
comment
Я настоятельно рекомендую описать эту идею более подробно новым вопросом самостоятельно. Если я не ошибаюсь, функциональность динамического импорта из Python более или менее используется по умолчанию в R. Что вы не можете сделать в R, для чего вам нужно реализовать новые классы? Я не пытаюсь сказать, что такой вещи не существует, но просто, может быть, вы пытаетесь делать что-то в R в стиле Python, в то время как с помощью R их легче достичь. - person January; 12.07.2019
comment
Спасибо за ваш комментарий. Я сделаю это. - person Nathan; 13.07.2019

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

bar = "S4"

To

bar = "Bar"

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

person Nathan    schedule 11.07.2019