我正在尝试编写只能接收包含两个数字向量或两个数字向量的数据帧的函数。但如果功能正常我就不能写。
lad=function(...){
z=(...);
if (!is.data.frame(z) & length(z)!=2 | !is.vector(z[[1]] & !is.vector(z[[2]] & length(z[[1]])!=length(z[[2]])) stop ('arguments must contain data frame or two vectors')
}
这里的问题在哪里?
函数可能包含lad(x,y)
或lad(z)
z=data.frame(x,y)
答案 0 :(得分:3)
通常使用S3或S4完成。使用S3,我们使用data.frame和默认(处理其他情况)的方法创建泛型:
lad <- function(x, ...) UseMethod("lad")
lad.data.frame <- function(x, ...) x
lad.default <- function(x, y, ...) lad(data.frame(x, y), ...)
lad将调用带有lad.data.frame的data.frame参数的调用以及对lad.default的所有其他调用,所以如果你需要实现进一步的检查,那么这些是放置它们的地方。
在上面的示例中,我们只返回一个数据框,但在实际代码中用更有用的东西替换它。
以下是调用lad
的两个示例(其中BOD
是R附带的数据框):
lad(BOD)
lad(1:10, 11:20)