【问题标题】:Overwrite a function in R. Avoiding infinite recursion覆盖 R 中的函数。避免无限递归
【发布时间】:2015-10-30 11:25:13
【问题描述】:

我想覆盖 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)
}

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

【问题讨论】:

标签: r function recursion overriding


【解决方案1】:

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

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

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

    base::as.numeric(x)
}

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

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

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 2013-05-25
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2020-01-22
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多