0

単一のベクトルを操作する関数を作成しました。ときどきその機能をまるごと使いたくなるdata.framesapply関連する変数全体を使用することでそれを達成できますが、S3 メソッドを使用して関数を含めて指示する必要があります。

まず、セットアップ:

df_test <- data.frame(x = c(1, 2, 3, 4, 5), 
                      y = c(6, 7, 8, 9, 10), 
                      z = c(11, 12, 13, 14, 15))

adder <- function(x, from, to) {
  if(is.null(ncol(x))) {
    x <- structure(list(x = x, from = from, to = to), class = "single")
  } else {
    x <- structure(list(x = x, from = from, to = to), class = "multiple")
  }
  UseMethod("adder", x)
}

adder.single <- function(x, from, to) {
  x <- x + (from - to) # just some random operation here - the real function does more
  x
}

adder.multiple <- function(x, from, to) {
  x <- sapply(x, function(y) { 
    y <- structure(list(x = y, from = from, to = to), class = "single"); 
    UseMethod("adder", y) })
  x
}

したがって、単一のベクトルでは、関数は機能します。

> adder(df_test[,1], 2, 4)
[1] -1  0  1  2  3

しかし、全体を渡すことdata.frameはできません:

> adder(df_test, 2, 4)
Error in from - to : 'from' is missing

問題が何であるかは明らかです-adder私たちが全体を見ていることを検出しdata.frame、「複数の」メソッドを使用し、それが「単一の」メソッドと引数fromを呼び出しtoて渡されていません。

Hadley Wickham のOOP Field GuideとNicolas Christian のAdvanced Programmingを読みましたが、私には合いませんでした。S3 メソッドを使用する限り、まったく異なるアプローチを歓迎します。この演習の一部は、S3 メソッドの使用方法を学習するためです。

4

1 に答える 1

2

呼び出すだけでadder、S3 ディスパッチが適切な機能を実行し、適切な関数を呼び出します。

adder.multiple <- function(x, from, to) {
  sapply(x,  adder,from,to)
}

ジェネリックadderを 2 回 ( への呼び出しUseMethod) 定義しないでください。

于 2014-01-24T20:09:28.827 に答える