なんか前の(S3クラスによるメソッド定義 - もうカツ丼でいいよな)はどうも違う.
そもそも汎用関数がクラスを判別して適切なメソッドへオブジェクトを引き渡すためには関数UseMethodを使う.この時別に汎用関数で指定された引数がオブジェクトのメソッドで使用されなくても何の問題も起きない.
> fun <- function(..., x="hoge") UseMethod("fun") > fun.character <- function(...) print(...) > fun("piyo") [1] "piyo"
大抵の汎用関数は多少の差はあれUseMethodを呼び出している.
> mean function (x, ...) UseMethod("mean") <environment: namespace:base> > print function (x, ...) UseMethod("print") <environment: namespace:base> > sort function (x, decreasing = FALSE, ...) { if (!is.logical(decreasing) || length(decreasing) != 1L) stop("'decreasing' must be a length-1 logical vector.\nDid you intend to set 'partial'?") UseMethod("sort") } <environment: namespace:base>
ただsumは.Primitiveで内部関数を呼び出していて
> sum function (..., na.rm = FALSE) .Primitive("sum")
どうも.Primitive使ってる関係で引数の取り扱いがアレなんじゃないかと思ったりしたけど結局良く分からない.
- http://projetos.inpa.gov.br/i3geo/pacotes/r/win/library/base/html/Primitive.html
- R Language Definition:
- http://cran.r-project.org/doc/contrib/manuals-jp/R-exts.jp.pdf
あたりを見てもイマイチなんのことやらなのでもう寝る.