Что позволяет Comparable
для вас сортировать объекты Person
, когда они находятся в контейнере, например List
или Array
.
Предлагаю посмотреть Arrays
и Collections
для того, как это сделать.
Кажется, переопределение метода инициализации сработало для меня. Например,
setClass("Person",
representation(name = "character", age = "numeric", doubleAge = "numeric"),
prototype(name = "Bob", age = 5, doubleAge = 10) )
setMethod("initialize", "Person", function(.Object, ...) {
.Object <- callNextMethod()
.Object@doubleAge <- .Object@age*2
.Object
})
(p1 <- new("Person", name = "Alice", age = 6))
# An object of class "Person"
# Slot "name":
# [1] "Alice"
# Slot "age":
# [1] 6
# Slot "doubleAge":
# [1] 12
callNextMethod()
запускает инициализатор «по умолчанию», чтобы установить все значения, с которыми мы не связываемся. Затем мы просто изменяем нужные значения и возвращаем обновленный объект.
В дополнение к описанному выше методу для initialize
, вы можете установить метод для @<-
. Причина этого в том, что если вы делаете что-то вроде
x <- new("person", age=5)
, то у вас есть действующий человек с age=5
и doubleage=10
. Но что, если вы сейчас сделаете
x@age <- 6
? Теперь age
равно 6, но doubleage
по-прежнему 10, поэтому объект больше не действителен.
В документации R утверждается, что вы можете написать метод для @<-
, который исправит это:
setMethod("@<-",signature(object="Person"),function(object,name,value){
if(name=="age"){
object@age <- x
object@doubleAge <- x*2
} else if(e2=="doubleAge"){
object@doubleAge <- x
object@age <- value/2
} else slot(object,name) <- value
object
})
, однако, когда вы на самом деле запустите вышеуказанное, вы получите ошибку:
Ошибка в setGeneric (f, где = где): '@ < -' отправляет изнутри; методы могут быть определены, но обобщенная функция неявна и не может быть изменена.
blockquote>Это странно выглядящая ошибка, поскольку мы не пытаемся переопределить универсальный тип. Фактически, когда мы пытаемся
method.skeleton("@<-",signature(object="Person"))
, мы обнаруживаем, что R неохотно сообщает нам
Ошибка в genericForBasic (name): методы не могут быть определены для примитивной функции '@ < - 'в этой версии R
blockquote>Таким образом, если вы хотите, чтобы слоты были надежно согласованы, нам придется написать наши собственные методы получения и установки, в соответствии с
setAge <- function(x,value){ x@age <- value x@doubleAge <- value*2 x }