Как создать класс S4 A, который будет иметь список классов S4 B в качестве атрибута? - PullRequest
1 голос
/ 16 марта 2020

Я довольно новичок в R, поэтому мой вопрос может иметь очевидный ответ.

Я пытаюсь создать что-то вроде этого

A {
  list: B []
}

Где A и B - классы S4. Как этого добиться?

EDIT

На самом деле мне все равно, является ли атрибут list массивом или фактическим списком. Для моего случая использования это не имеет значения.

1 Ответ

2 голосов
/ 16 марта 2020

Вы определяете классы S4 с помощью setClass, и внутри этого вы используете representation для объявления членов и их типов.

В этом случае класс A должен содержать только член типа list для размещения коллекции объектов класса S4 B.

setClass("A", representation(List = "list"))
setClass("B", representation(value = "numeric"))

Вы объявляете новый S4 объекты с функцией new, в которой вы сначала указываете имя класса и их члены в качестве именованных параметров:

my_object <- new("A", List = list(new("B", value = 1), new("B", value = 2)))
my_object
#> An object of class "A"
#> Slot "List":
#> [[1]]
#> An object of class "B"
#> Slot "value":
#> [1] 1
#> 
#> 
#> [[2]]
#> An object of class "B"
#> Slot "value":
#> [1] 2

Мы можем получить член List, используя оператор @:

my_object@List
#> [[1]]
#> An object of class "B"
#> Slot "value":
#> [1] 1
#> 
#> 
#> [[2]]
#> An object of class "B"
#> Slot "value":
#> [1] 2

Из которого мы можем получить доступ к членам списка и их слотам S4 напрямую:

my_object@List[[1]]
#> An object of class "B"
#> Slot "value":
#> [1] 1

my_object@List[[1]]@value
#> [1] 1

Создано в 2020-03-16 пакетом prex (v0.3.0)

...