0

我创建了一个函数,该函数具有相当多的参数(所有向量的长度相同),我认为能够将参数捆绑在数据框中会使生活变得更容易。我已经设法使用 S3 方法实现了这一点,但是阅读更多关于 S3 方法的信息后,我开始怀疑我编写函数的方式是否有点滥用 S3 约定。

我想知道我所做的是否是一个坏主意。如果是这样,替代方法将受到欢迎。

这是我所做的一个简化示例:

myfunc <- function(x, ...) UseMethod("myfunc")

myfunc.default(time, money, age, weight) {
   # a silly calculation
   return(money/(age + weight) - time)
}

myfunc.data.frame <- function(params, ...) {
  names(params) <- tolower(names(params))
  pass.args <- intersect(names(params), names(formals(myfunc.default)))
  res <- do.call(myfunc.default, c(params[pass.args], ...))
  return(res)
}

mydata然后,如果我有一个包含列名Money, time,的数据框AGEweight然后name像这样的调用myfunc(mydata)会将相关数据传递给myfunc.default. 这一切都很好,但它是明智的吗?

4

1 回答 1

0

感谢您的评论。我已经得出结论,我在这里使用 S3 方法的策略是个坏主意。我已切换到两个功能,例如myfuncmyfunc_df。我还创建了一个辅助函数,用于将具有单个参数的函数转换为接受数据框的函数:

df_call <- function(.function, .parameters, .case=tolower, ...) {
  try(names(.parameters) <- match.fun(.case)(names(.parameters)))
  pass.args <- intersect(names(.parameters), names(formals(.function)))
  do.call(.function, c(.parameters[pass.args], list(...)))
}
于 2012-08-25T21:17:26.073 回答