缺少参数时的 S3 方法调度

  • 本文关键字:S3 方法 调度 参数 r
  • 更新时间 :
  • 英文 :


对于模糊的标题,我深表歉意,想不出任何简短而具体的东西。

我有一个函数foo它执行一些不相关的计算。 我做了以下方法。

foo.data.frame <- function(data, col1, col2){
return(data.frame(col1 = data[[col1]],
col2 = data[[col2]]))
}
foo.list <- function(data){
z <- unlist(data)
d <- names(z)
return(data.frame(col1 = z, col2 = d))
}
foo.character <- function(data){ #here data is a file address
if(file.exists(data)){
return(read.csv(data, row.names = 1))
}
} 

一些数据:

df <- data.frame(col1 = letters[1:10],
col2 = 1:10)
lis <- as.list(df$col2)
names(lis) <- df$col1
write.csv(df, "df.csv")

这些功能执行:

foo.data.frame(df, "col1", "col2"),
foo.list(lis)
foo.character("df.csv")

我正在努力创建一种方法,该方法将向量作为col1col2的输入:

foo.??? <- (data = NULL, col1, col2){
return(data.frame(col1, col2))
}

将像这样使用:

foo(col1 = df$col1, col2 = df$col2)

这可以是

foo.default 

或不

我应该怎么做?

请注意,使用"poor mans S3"(当所有这些函数都在一个函数中时,并使用 if-then-else 子句将相应类的对象定向到适当的方法)很容易做到这一点。

您需要在foo泛型中处理它。例如

foo.missing <- function(col1, col2) {
data.frame(col1 = col1, col2 = col2)
}
foo <- function(data, ...) {
if (missing(data) || is.null(data)) foo.missing(...)
else UseMethod("foo")
}
# test    
foo(col1 = df$col1, col2 = df$col2)
foo(df, "col1", "col2"),
foo(lis)
foo("df.csv")

最新更新