获取具有S3泛型函数的数据类型列表

时间:2015-05-22 07:08:28

标签: r generics types r-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完全是新手,我可能会做一些基本上错误的事情。

1 个答案:

答案 0 :(得分:1)

apply的第一个参数必须是类似矩阵的对象(即矩阵,数组或data.frame)。否则你会收到此错误:

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

您正在将列表传递给apply,但由于您告诉apply沿第一维应用该功能且列表没有维度,因此无效。<\ n} / p>

您可能希望使用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方法调度,则不必在方法内测试类,因为只有在对象具有相应的类时才调度方法。