我正在向我的软件包 (OneR) 添加一个标准的 S3 方法调度系统,其中我有一个用于数据帧的方法和一个用于公式的方法。
我遇到的问题是我对这两种方法都有不同的论据。调用数据框方法时,我不需要data
参数,因为数据已经存在于x
参数中。 仅在调用公式方法时需要data
。
我是这样做的:
Usage
optbin(x, data, method = c("logreg", "infogain", "naive"), na.omit = TRUE)
## S3 method for class 'formula'
optbin(x, data, method = c("logreg", "infogain", "naive"),
na.omit = TRUE)
## S3 method for class 'data.frame'
optbin(x, data = x, method = c("logreg", "infogain",
"naive"), na.omit = TRUE)
Arguments
x either a formula or a data frame with the last column containing the target variable.
data data frame which contains the data, only needed when using the formula interface because otherwise 'x' will already contain the data.
method character string specifying the method for optimal binning, see 'Details'; can be abbreviated.
na.omit logical value whether instances with missing values should be removed.
我最初以为我可以省略数据框方法中的data
参数,但在检查包时我收到警告,因为它存在于UseMethod
函数中......当我把它留在那里时,由于方法之间的不一致,我会收到另一个警告。我也尝试了...
但除了我必须记录它之外,我还在那里收到警告,这会让用户感到困惑而不是帮助。
但是我也没有发现我的解决方案理想,因为数据框方法中的data = x
参数。它可能会使人们感到困惑,并且是错误的潜在来源。
我的问题
解决这种情况的最佳方法是什么,即当您有两种具有不同参数的方法时?
通常的方法是有一个泛型,除了...
之外没有额外的参数。每个接口方法都应调用实现实际模型拟合的基础default
方法。
optbin <- function(x, ...)
UseMethod("optbin")
optbin.formula <- function(formula, data, method, na.omit, arg1, arg2, ...)
{
...
optbin.default(x, y, arg1, arg2)
}
optbin.data.frame <- function(data, method, na.omit, arg1, arg2, ...)
{
...
optbin.default(x, y, arg1, arg2)
}
optbin.default <- function(x, y, arg1, arg2)
{ ... }
例如,请参阅 nnet 和 MASS 包如何处理公式的方法。