LoginSignup
1
1

More than 5 years have passed since last update.

RでexportされていないS3メソッドの中身の確認方法

Last updated at Posted at 2018-10-19

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)

svm.jpg

このときplotは中でどういう処理をしているのかを知るにはどうしたらいいでしょうか?知っておくべきことは、plotはジェネリック関数と呼ばれていて、引数として受け取った変数のクラスに対応するメソッドを実行しているということです。そこで変数fitのクラスをまず調べます:

> class(fit)
[1] "svm.formula" "svm"        

fitsvm.formulasvmのふたつのクラスに属していることが分かりました。次に、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 といった具合にパッケージ名と関数名を ::: で区切るとその関数がエクスポートされているかどうかによらず、参照でき

ました!

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1