当参数缺失时的S3方法调用分派

4

很抱歉标题有些模糊,我无法想到一个简短明确的。

我有一个函数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 

是否

我该怎么做呢?

请注意,使用“贫人S3”(当所有这些功能都在一个函数内,并通过使用if-then-else语句将适当类的对象指向适当方法)很容易实现。

1个回答

2
你需要在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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接