1

編集:質問は、一般的な方法が機能しない理由ではなく、特定の拡張機能が機能しない理由に少し変更されました。

タイトルが示すように、関数を他の (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を使用してきましたが、他のソースも常に高く評価されています。

乾杯

4

2 に答える 2