Как исправить «UseMethod Error» в R, в котором говорится, что к объекту класса «subject» не применен метод для «посещения» - PullRequest
0 голосов
/ 22 декабря 2018

Я очень новичок в объектно-ориентированном R-кодировании.Данные имеют пять столбцов: идентификатор, посещение, комната, значение и время.Значение - это, в основном, показания датчика для различных типов комнат, таких как «Спальня», «Столовая» и т. Д. Значение посещения может быть 0, 1 или 2.

Мой код R выдает ошибку: Ошибка в UseMethod («посещение»): нет применимого метода для «посещения», примененного к объекту класса «субъект»

Код, который выдает эту ошибку:

out <- subject (x, 44)%>% visit (0)%>% room ("спальня")

# Create Summary method
print.Summary <- function(x) {
  cat("ID:", x[[1]], "\n")
  print(x[[2]])
  invisible(x)
}

# create custom method to print specific output on LongitudinalData when needed
print.LongitudinalData <- function(x) {
  cat("Longitudinal dataset with", length(x[["id"]]), "subject")
  invisible(x)
}

#create custom method to print
subject.LongitudinalData <- function(x, id) {
  index <- which(x[["id"]] == id)
  if (length(index) == 0)
    return(NULL)
  structure(list(id = id, data = x[["data"]][[index]]), class = "subject")
}

print(dataset)

# Custom method to create generic subject function
subject <- function(x, id) UseMethod("subject")
print.subject <- function(x) {
  cat("subject ID:", x[["id"]])
}

# test generic function
out <- subject(dataset, 10)
print(out)
out <- subject(dataset, 14)
print(out)

# Create Subject Methods
summary.Subject <- function(x){
  summaryout <- x[["data"]] %>%
    group_by(visit, room) %>%
    summarise(value = mean(value)) %>%
    spread(room, value) %>%
    as.data.frame
  structure(list(id = x[['id']],
                 summaryout = summaryout), class = 'Summary')
}

# Test subject summary method
out <- subject(dataset, 54) %>% summary
print(out)

visit.Subject <- function(subject, visit_num) {
  if (!visit_num %in% 0:2)
    stop("The number for visit must be 0, 1, or 2")
  data <- subject[["data"]] %>%
    filter(visit == visit_num) %>%
    select(-visit)
  structure(list(id = subject[["id"]],
                 visit_num = visit_num,
                 data = data), class = "visit")
}

# Custom method to create generic visit function
visit <- function(subject, visit_numb) UseMethod("visit")

room.Visit <- function(visit, room_name) {
  if (!room_name %in% visit[["data"]][["room"]])
    stop("You must use a valid room name from the specified visit")
  data <- visit[["data"]] %>%
    filter(room == room_name) %>%
    select(-room)
  structure(list(id = visit[["id"]],
                 visit_num = visit[["visit_num"]],
                 room = room_name,
                 data = data), class = "Room")
}

# Create room methods
print.Room <- function(x) {
  cat("ID:", x[["id"]], "\n")
  cat("Visit:", x[["visit_num"]], "\n")
  cat("Room:", x[["room"]])
  invisible(x)
}

summary.Room <- function(x) {
  output <- summary(x[["data"]][["value"]])
  structure(list(id = object[["id"]],
                 output = output), class = "Summary")
}

Я проверил класс по предмету (x, 44).Он относится к классу "Предмет".

Пожалуйста, помогите.

Данные выглядят следующим образом:

enter image description here

Ожидаемый результат для следующего кода должен быть:

out <- subject(x, 44) %>% visit(0) %>% room("bedroom")
print(out)

ID: 44

Посещение: 0

Комната: спальня

...