編集:質問は、一般的な方法が機能しない理由ではなく、特定の拡張機能が機能しない理由に少し変更されました。
タイトルが示すように、関数を他の (S3) クラスに拡張するのに問題があります。
例えば:
x <- y <- runif(10)
loessModel = loess(y ~ x)
methods("cor")
## [1] cor.test cor.test.default* cor.test.formula*
cor.loess = function(loessModel, ...) { cor(loessModel$x, loessModel$y, ...) }
cor(loessModel)
## Error in cor(loessModel) : supply both 'x' and 'y' or a matrix-like 'x'
ただし、次のように動作します。
getCor = function(x, y, ...) { UseMethod("getCor") }
getCor.default = function(x, y, ...) { cor(x, y, ...) }
getCor.loess = function(loessModel, ...) getCor(loessModel$x, loessModel$y, ...)
getCor(loessModel)
## [,1]
## x 1
だから...ジョシュが説明したように、拡張の最初の方法は一般的な関数ではないcor
ため機能しcor
ませんでした。2 番目の方法は機能しますが、 のクラスに拡張することはできませんLoessList
。これは、特に「関数の外」で機能するため、私には不可解です。
set.seed(13)
df = data.frame(id = rep.int(1:2, 10),
x = runif(20),
y = runif(20))
loessList = structure(dlply(df, "id", loess, formula = as.formula("y ~ x")),
class = "LoessList")
getCor.LoessList = function(loessList, ...) { ldply(loessList, getCor, ...) }
getCor(loessList)
## Error in is.data.frame(y) : argument "y" is missing, with no default
ldply(loessList, getCor)
## id 1
## 1 1 -0.01552707
## 2 2 -0.38997723
より一般的な注意として、R の OOP に関する適切なガイドはありますか? 私は主な参考資料としてhttp://logic.sysbiol.cam.ac.uk/teaching/advancedR/slides.pdfを使用してきましたが、他のソースも常に高く評価されています。
乾杯