Получить список типов данных с универсальной функцией S3

Я пытаюсь написать функцию, в которую я могу добавить произвольное количество объектов и получить список типов данных этих объектов. Это личное задание для изучения S3 Generics.

Что я сделал до сих пор:

myTypes <- function(x, ...) {
  dots <- list(...)
  return (as.list(apply(dots, 1, myType)))
}

myType <- function(x){
  UseMethod("myType")
}

myType.numeric <- function(x){
  if(is.numeric(x)) "Type: numberic"
}

myType.data.frame <- function(x){
  if(is.data.frame(x)) "Type: dataframe"
}

Ошибка возникает, например, когда я звоню

x <- 1
y <- 3

myTypes(x,y)

Я всегда получаю ошибку: "Error in apply(dots, 1, myType) : dim(X) must have a positive length" и я не уверен, что не так. Может ли кто-нибудь помочь мне здесь? Так как я абсолютно новичок в R I, возможно, делаю что-то в принципе неправильно.

1 ответ

Решение

Первый аргумент apply должен быть подобным матрице объектом (то есть матрицей, массивом или data.frame). В противном случае вы получите эту ошибку:

apply(1, 1, mean)
#Error in apply(1, 1, mean) : dim(X) must have a positive length

Вы передаете список apply, который не может работать, потому что вы говорите apply применить функцию по первому измерению, а список не имеет измерений.

Вы, вероятно, хотите использовать lapply и не apply:

myTypes <- function( ...) {
  dots <- list(...)
  lapply(dots, myType)
}

x <- 1
y <- 3

myTypes(x,y)
#[[1]]
#[1] "Type: numberic"
#
#[[2]]
#[1] "Type: numberic"

Конечно, кажется более полезным просто вернуть класс:

myTypes <- function(...) {
  dots <- list(...)
  lapply(dots, class)
}

myTypes(x,y)
#[[1]]
#[1] "numeric"
#
#[[2]]
#[1] "numeric"

Кстати, если вы используете диспетчеризацию метода S3, вам не нужно тестировать класс внутри метода, потому что метод отправляется только в том случае, если объект имеет соответствующий класс.

Другие вопросы по тегам