Как инициализировать новый объект в классе S4? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть такие данные:

data = data.frame( id = rbinom(1000, 10, .75),
            visit = sample(1:3, 1000, replace = TRUE),
            room = sample(letters[1:5], 1000, replace = TRUE),
            value = rnorm(1000, 50, 10),
            timepoint = abs(rnorm(1000))
)
head(data)
id visit room    value  timepoint
1  8     3    a 62.53394 1.64681140
2  9     1    c 53.67313 1.04093204
3  6     1    c 64.96674 0.40599449
4  8     2    d 41.04145 0.09911475
5  7     2    b 63.86938 1.01732424
6  7     3    c 42.03524 2.04128413

Я определил класс S4 для чтения этих данных как longitudinalData.Класс идет следующим образом.

setClass("longitudinalData",
         slots = list(id = "integer", 
                      visit = "integer",
                      room = "character",
                      value = "numeric",
                      timepoint = 'numeric'))

Чтобы инициировать новый объект в этом классе, я определил следующую функцию.

make_LD = function(x){
new("longitudinalData",
          id = x$id,
          visit = x$visit,
          room = x$room,
          value = x$value,
          timepoint = x$timepoint
  )
}

, когда я пытаюсь добавить новый объект с помощью make_LD(data), я получаю следующую ошибку.

> make_LD(data)
Error in initialize(value, ...) : 
  no slot of name "refMethods" for this object of class "classRepresentation"

Что означает эта ошибка?

Как от этого избавиться?

1 Ответ

0 голосов
/ 07 июня 2018

Самый простой способ избежать подобных проблем - сохранить значение из setClass, которое возвращает удобную для вас функцию конструктора.

setClass("longitudinalData",
         slots = list(id = "integer", 
                      visit = "integer",
                      room = "character",
                      value = "numeric",
                      timepoint = 'numeric')) -> longitudinalData

make_LD = function(x){
longitudinalData(
          id = x$id,
          visit = x$visit,
          room = x$room,
          value = x$value,
          timepoint = x$timepoint
  )
}

Нормально дать функцию конструкторато же имя, что и у класса, но вам не обязательно.

...