Rのパッケージの多くは、データを入力として受け取って、色々な処理をした結果を返してくれます。さらに、その結果をいい感じにプロットしてくれることが多いです。プロットがどう実装されているのか確認するには、exportされていないS3メソッドの中身を見る必要があります。
具体例として、機械学習関連のパッケージe1071
でのSVMのプロットをやってみます。
library(e1071)
# irisデータセットから、2ラベル、2特徴量を選ぶ
iris.part = subset(iris, Species != 'setosa')
iris.part$Species = factor(iris.part$Species)
iris.part = iris.part[, c(1,2,5)]
# SVMモデルをフィットさせる
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')
# 可視化
plot(fit, iris.part)
このときplot
は中でどういう処理をしているのかを知るにはどうしたらいいでしょうか?知っておくべきことは、plot
はジェネリック関数と呼ばれていて、引数として受け取った変数のクラスに対応するメソッドを実行しているということです。そこで変数fit
のクラスをまず調べます:
> class(fit)
[1] "svm.formula" "svm"
fit
はsvm.formula
とsvm
のふたつのクラスに属していることが分かりました。次に、plot
に含まれているメソッドの一覧を確認して、どちらのクラスに対応するメソッドが呼ばれているかを調べます:
> methods("plot")
[1] plot.acf* plot.bclust* plot.data.frame*
[4] plot.decomposed.ts* plot.default plot.dendrogram*
[7] plot.density* plot.ecdf plot.factor*
[10] plot.formula* plot.function plot.hclust*
[13] plot.histogram* plot.HoltWinters* plot.ica*
[16] plot.isoreg* plot.lm* plot.medpolish*
[19] plot.mlm* plot.ppr* plot.prcomp*
[22] plot.princomp* plot.profile.nls* plot.raster*
[25] plot.SOM* plot.somgrid* plot.spec*
[28] plot.stepfun plot.stft* plot.stl*
[31] plot.svm* plot.table* plot.ts
[34] plot.tskernel* plot.TukeyHSD* plot.tune*
see '?methods' for accessing help and source code
plot.svm
だけ見つかったので、このメソッドが呼ばれていることが分かります。ここで*
は、exportされていないことを示しています。そのため、次のように直接アクセスすることはできません:
> plot.svm
Error: object 'plot.svm' not found
このようなメソッドの中身を見るためには、getAnywhere
関数を使います:
> getAnywhere("plot.svm")
A single object matching ‘plot.svm’ was found
It was found in the following places
registered S3 method for plot from namespace e1071
namespace:e1071
with value
# ...以下省略
あるいはsvm
クラスに対応したplot
メソッドを見るというやりかたでgetS3method("plot","svm")
としても同様の結果が得られます。
追記:コメントで教えていただきました。
e1071:::plot.svm といった具合にパッケージ名と関数名を ::: で区切るとその関数がエクスポートされているかどうかによらず、参照でき
ました!