2013-07-13 13 views
3

V1:假設函數f(x, ...)g(x , ...)可以傳遞不同的參數。如果我要使用它們來定義一個新函數,我可以通過...運算符來定義參數嗎?作爲一個簡單的例子:R:如何使用...傳遞參數到多個函數定義良好?

f1 = function(x, n = 1) x + n 
g1 = function(x, m = 1) x + m 
f = function(x, ...) f1(x, ...) 
g = function(x, ...) g1(x, ...) 

h = function(x, ...) { 

    fgList = list() 
    fgList[["f"]] = f(x, ...) 
    fgList[["g"]] = g(x, ...) 
    return(fgList) 
} 

h(1:4) 
# $f 
# [1] 2 3 4 5 

# $g 
# [1] 2 3 4 5 

h(1:4, n = 2) 
# Error in g1(x, ...) : unused argument (n = 2) 

該參數n被向下傳遞到功能fg和,但它僅用於功能f明確定義。我想減輕這一點。

V2:如果它們是我定義的函數,那麼Hong Ooi的解決方案就完美了。

此解決方案是否可以擴展用於沒有...參數的預定義函數,或者是否可以將...參數「添加」到沒有一個的預定義函數?例如:

h = function(x, ...) mean(x, ...) * median (x, ...) 
h(1:4, test = 1) 
## Error in median(x, ...) : unused argument (test = 1) 
+0

V2:你總是可以做'均值(X,...)* {功能(Y,...) median(y)}(x,...)'但是我覺得如果函數沒有使用這些額外的參數來定義'...',那麼我會小心地使用它。 – baptiste

回答

8

在一個環境中不能有多個版本的...。然而,你可以做的是給你的每個被調用的子函數...自己的自己的。這意味着他們會忽略任何傳遞的參數,而這些參數與他們自己的形式參數不匹配。

f1 = function(x, n = 1, ...) x + n 
g1 = function(x, m = 1, ...) x + m 

> h(1:4, n = 2) 
$f 
[1] 3 4 5 6 

$g 
[1] 2 3 4 5 

編輯回答問題補充:可以使median一個新的版本,當你在自己的代碼調用它,這將覆蓋預定義的函數。 (由於與R命名空間是如何工作的,其他預定義功能仍將使用現有版本。)

median <- function(x, na.rm=FALSE, ...) 
base::median(x, na.rm) # function median exported from base package 
+1

+1。感謝gawd有人能夠弄清楚被問到的是什麼。 –

+0

加上一個答案和@迪文的評論。不知道你是如何從這個問題得到的。做得好 –

+0

@ HongOoi:非常感謝你的回答。 @DWin:對於R來說是比較新的,我認爲通過一個例子來問我的問題會更好。在閱讀了HongOoi的*有用*回覆並接受你的評論之後,我已經相應地編輯了我的問題 - 儘管從你評論的演繹性質來看,我很驚訝你還沒有這樣做。 – Mullefa

相關問題