как установить значение в объекте S4 r, используя метод (входное значение не требуется)

Что позволяет Comparable для вас сортировать объекты Person, когда они находятся в контейнере, например List или Array.

Предлагаю посмотреть Arrays и Collections для того, как это сделать.

6
задан channon 20 February 2019 в 21:21
поделиться

2 ответа

Кажется, переопределение метода инициализации сработало для меня. Например,

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() запускает инициализатор «по умолчанию», чтобы установить все значения, с которыми мы не связываемся. Затем мы просто изменяем нужные значения и возвращаем обновленный объект.

0
ответ дан MrFlick 20 February 2019 в 21:21
поделиться

В дополнение к описанному выше методу для 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, где = где): '@ < -' отправляет изнутри; методы могут быть определены, но обобщенная функция неявна и не может быть изменена.

Это странно выглядящая ошибка, поскольку мы не пытаемся переопределить универсальный тип. Фактически, когда мы пытаемся

method.skeleton("@<-",signature(object="Person"))

, мы обнаруживаем, что R неохотно сообщает нам

Ошибка в genericForBasic (name): методы не могут быть определены для примитивной функции '@ < - 'в этой версии R

Таким образом, если вы хотите, чтобы слоты были надежно согласованы, нам придется написать наши собственные методы получения и установки, в соответствии с

setAge <- function(x,value){
  x@age <- value
  x@doubleAge <- value*2
  x
}
0
ответ дан JDL 20 February 2019 в 21:21
поделиться