我尝试编写一个函数,我可以在其中抛出一些对象并获取该对象的数据类型列表。这是学习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完全是新手,我可能会做一些基本上错误的事情。
答案 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方法调度,则不必在方法内测试类,因为只有在对象具有相应的类时才调度方法。