R ссылочные классы как поле ссылочного класса

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

1) Пожалуйста, кто-нибудь может объяснить, почему происходит эта ошибка:

> a <- ClassA&new()
Error in .getClassFromCache(Class, where) : 
  argument "Class" is missing, with no default
> b <- ClassB$new(a)
Error in .Object$initialize(...) : object 'a' not found

2) Я объявил class.a.container как класс "list", однако я хочу, чтобы это был ссылочный класс. Что мне нужно поставить здесь вместо "списка"?

ClassA <- setRefClass(
  "ClassA",

  fields = list(myVar = "numeric"),

  methods = list(
    someMethod = function(){
      print("hi")
    }
  )
)

ClassB <- setRefClass(
  "ClassB",

  fields = list(class.a.container = "list"),

  methods = list(
    initialize = function(class.a){
      class.a.container <<- class.a
  })
)

a <- ClassA&new()
b <- ClassB$new(a)

2 ответа

Решение

Ты будешь чувствовать себя глупо, по крайней мере, я, когда заметил проблему. В извлечении из предмета envirnment-class у вас есть знак амперсанда со знаком доллара.

a <- ClassA$new(myVar=1)
a$someMethod(2)
#[1] "hi

42- уже указал на одну ошибку в вашем коде (& вместо $).

Чтобы полностью ответить на ваш первоначальный вопрос, я просто хочу прямо указать, что после исправления этой ошибки вам нужно изменить объявление поля в ClassB с

class.a.container = "list"

в

class.a.container = "ClassA"

Вот полный код, который работает для меня:

ClassA = setRefClass(
    Class = "ClassA",

    fields = list(myVar = "numeric"),

    methods = list(
        someMethod = function() {
            print("hi")
        }
    )
)

ClassB = setRefClass(
    Class = "ClassB",

    fields = list(class.a.container = "ClassA"),

    methods = list(
        initialize = function(class.a) {
            class.a.container <<- class.a
        }
    )
)

a = ClassA$new(myVar = 1)
a

b = ClassB$new(a)
b

Это печатает:

...
> a
Reference class object of class "ClassA"
Field "myVar":
[1] 1
> 
> b = ClassB$new(a)
> b
Reference class object of class "ClassB"
Field "class.a.container":
Reference class object of class "ClassA"
Field "myVar":
[1] 1
Другие вопросы по тегам