覆盖R中的函数。避免无限递归

时间:2015-10-30 11:25:14

标签: r function recursion overrides

我想覆盖R中的某些功能,为它们添加功能或修改它们的行为。例如,我不能忍受min,max,mean,sd和其他的默认情况下na.rm参数为false,或者如果你在一个因子上运行as.numeric,它不解析级别文本但是级别标识符

所以我想改写它:

as.numeric <- function(x) {
    if(is.numeric(x)) return(x)
    if (is.factor(x)) x <- as.vector(x)

    as.numeric(x)
}

不幸的是,这会触发无限递归(当然)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果你小心隔离名字(不幸的是R不鼓励这样做),没有理由反对覆盖现有名称。

在您的情况下,您所要做的就是明确限定要调用的函数的包名称,以消除歧义:

as.numeric <- function(x) {
    if(is.numeric(x)) return(x)
    if (is.factor(x)) x <- as.vector(x)

    base::as.numeric(x)
}

那就是说,我会明智地使用它。

如果您发现自己影响现有的函数名称,您应该考虑在自己的命名空间中隔离您的名称。您可以使用modules正确执行此操作。