как получить список имен классов из эталонного класса в R

У меня есть этот код:

private$svg <- if(is(private$idaPlotObj, "DivosGridBmiPlot")){
  ...
} else {
  ...
}

в моем коде, и я пытаюсь реорганизовать этот код и получить список классов из private$idaPlotObj, который является эталонным классом, но все, что я получаю, это:

[1] "BMIDynamicRatiosPlot"
attr(,"package")
[1] "divosBMI"

когда я использую attr(private$idaPlotObj,"class") или class(private$idaPlotObj)

Как я могу получить все имена классов из эталонного класса? Если у меня будет 4 класса, мне нужно будет проверить каждый с помощью is. Я хотел бы сравнить векторы, чтобы проверить, есть ли класс в списке.


person jcubic    schedule 22.12.2020    source источник
comment
Я не очень хорошо знаком с эталонными классами, поэтому немного выстрелил в темноту: не могли бы вы использовать myclass <- class(private$idaPlotObj), чтобы получить класс вашего объекта, а затем использовать class_info <- getRefClass(myclass); class_info@generator$def@refSuperClasses, чтобы получить вектор всех имен классов?   -  person starja    schedule 22.12.2020
comment
@starja это работает. Благодарю. Вы можете добавить это как ответ, он выглядит проще, чем ответ, который уже был добавлен.   -  person jcubic    schedule 22.12.2020
comment
Сделанный; Я думаю, что другой ответ - хорошее одношаговое решение   -  person starja    schedule 22.12.2020


Ответы (2)


Вот что вы можете сделать для эталонных классов:

 [email protected]$.refClassDef@refSuperClasses

Пример:

setRefClass("Polygon", fields = list(sides="integer"))
setRefClass("Regular")
setRefClass("Triangle", contains = "Polygon")
EQL = setRefClass("EquilateralTriangle", contains = c("Triangle", "Regular"))

tri1 <- EQL$new(sides=3L)

Теперь, чтобы получить все классы tri1, мы делаем:

[email protected]$.refClassDef@refSuperClasses
[1] "Triangle"    "Regular"     "Polygon"     "envRefClass"

Редактировать

Собрав все вместе, вы можете сделать:

getRefClassNames <- function(obj) {
   c(class(obj), head([email protected]$.refClassDef@refSuperClasses, -1))
}
person Onyambu    schedule 22.12.2020

Вот решение, которое разбивает его на несколько шагов:

  1. получить текущее имя класса объекта:
myclass <- class(private$idaPlotObj)
  1. используйте getRefClass для получения информации о связанных классах:
class_info <- getRefClass(myclass)
  1. вы получаете объект, где информация немного скрыта, поэтому вам нужно его извлечь:
class_info@generator$def@refSuperClasses
person starja    schedule 22.12.2020