使用基本功能,但仅限于特定类

时间:2014-03-07 22:29:10

标签: r class

这些天来,名字越来越难了。我们最终需要使用a_function_to_find_the_correlation_of_a_data_set_but_slightly_different等名称来添加其他软件包。

我的问题如下:

如何使用基本函数的名称(例如cor)作为在特定类上运行的函数名在包中使用,如果它不属于该类,则假定从基础统计包中原始使用cor

以下是一个例子:

cor(mtcars[1:4, 1:4])

## > cor(mtcars[1:4, 1:4])
##             mpg        cyl       disp         hp
## mpg   1.0000000 -0.9753429 -0.4962289 -0.9753429
## cyl  -0.9753429  1.0000000  0.6755988  1.0000000
## disp -0.4962289  0.6755988  1.0000000  0.6755988
## hp   -0.9753429  1.0000000  0.6755988  1.0000000

cor <- 
function (x, ...) {
    UseMethod("cor")
}

dat <- "I wish robots would disappear."
class(dat) <- c("whammy_robots", class(dat))

cor.whammy_robots <- function(x, ...) {
    gsub("robots", "", x)
}

cor(dat)

## > cor(dat)
## [1] "I wish  would disappear."
## attr(,"class")
## [1] "whammy_robots" "character"    


cor(mtcars[1:4, 1:4])

## > cor(mtcars[1:4, 1:4])
## Error in UseMethod("cor") : 
##   no applicable method for 'cor' applied to an object of class "data.frame"

如果对象不属于此类(例如whammy.robots),有没有办法说出嘿,那么就像通常cor那样表现?

我认为我可以制作具体的新方法,例如:

cor.data.frame <- function(x, ...) {
   stats::cor(x, ...)
}

cor.matrix <- function(x, ...) {
   stats::cor(x, ...)
}

但这很快就变得错综复杂。

1 个答案:

答案 0 :(得分:5)

暂且不说你想做什么可能不是一个好主意......

您不必为每个可能的类定义方法。这就是默认方法的用途。

> cor.default <- stats::cor
> cor(mtcars[1:4, 1:4])
            mpg        cyl       disp         hp
mpg   1.0000000 -0.9753429 -0.4962289 -0.9753429
cyl  -0.9753429  1.0000000  0.6755988  1.0000000
disp -0.4962289  0.6755988  1.0000000  0.6755988
hp   -0.9753429  1.0000000  0.6755988  1.0000000