単一のベクトルを操作する関数を作成しました。ときどきその機能をまるごと使いたくなるdata.frame
。sapply
関連する変数全体を使用することでそれを達成できますが、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 メソッドの使用方法を学習するためです。