编辑:问题已经略微改变为为什么特定扩展不起作用,而不是为什么通用方法不起作用。
如标题所示,我无法将功能扩展到其他(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
所以......正如 Josh 所解释的,第一种扩展方法cor
不起作用,因为cor
它不是通用函数。第二种方法有效,但我无法将其扩展到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作为我的主要参考点,但其他来源总是很受欢迎。
干杯