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

Overwrite a function in R. Avoiding infinite recursion

我想覆盖 R 中的某些函数,向它们添加功能或修改它们的行为。例如,我无法忍受 min、max、mean、sd 和其他 na.rm 参数默认为 false,或者如果你 运行 as.numeric 在一个因素上它不会' t 解析关卡文本但解析关卡标识符。

所以我想重写一下:

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

    as.numeric(x)
}

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

如果您对隔离名称很谨慎(遗憾的是 R 不鼓励这样做),则没有理由反对覆盖现有名称。

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

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

    base::as.numeric(x)
}

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

如果您发现自己经常隐藏现有的函数名称,您应该考虑将您的名称隔离在它们自己的命名空间中。您可以使用 modules 来正确执行此操作。