2015-10-30 32 views
0

我想重写R中的某个函数,向它们添加特征或修改它们的行为。例如,对于min,max,mean,sd和其他参数,我无法忍受na.rm参数默认为false,或者如果您在因素上运行as.numeric,它不会解析关卡文本,而是关卡标识符。在R中覆盖函数避免无限递归

所以我想重写它:

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

    as.numeric(x) 
} 

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

+1

你为什么不用另一个名字? – Alex

+1

相关帖子http://stackoverflow.com/questions/17418640/is-it-possible-to-set-na-rm-to-true-globally – zx8754

回答

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正确执行此操作。