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列名が、、、Moneytimeデータフレームがある場合、このような呼び出しを行うと、関連するデータがに渡されます。それはすべてうまくいきますが、それは賢明ですか?AGEweightnamemyfunc(mydata)myfunc.default

4

1 に答える 1

0

コメントありがとうございます。ここで S3 メソッドを使用するという私の戦略は悪い考えであると結論付けました。myfuncとなどの 2 つの機能に切り替えましたmyfunc_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 に答える