2015-10-30 31 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正確執行此操作。