2015-06-10 65 views
4

我使用R中的dplyr包。使用我想創建一個功能類似dplyr:mutate_each中的可選參數

require(dplyr) 
aFunction <- function(x, optionalParam1="abc"){ 
    cat(optionalParam1, "\n") 
    return(x) 
} 
myFun <- function(data, ...){ 
    result <- data %>% mutate_each(funs(aFunction(., ...))) 
} 

,然後調用myFun所有可選參數應該轉嫁到aFunction時這樣稱呼它

data = data.frame(c1=c(1,2,3), c2=c(1,2,3)) 
myFun(data) # works 
myFun(data, optionalParam1="xyz") # doesn't work 

。但相反,錯誤'...' used in an incorrect context被拋出。

這是在不dplyr其工作方式它應該工作相同的功能...

myFun2 <- function(data, ...){ 
    for(c in colnames(data)){ 
     data[,c] = aFunction(data[,c], ...) 
    } 
} 

我怎麼能實現與dplyr相同的結果?

+0

你正在使用一個非常抽象的和有節奏的例子,你需要什麼和你想達到什麼?如果沒有這些信息,我只能說是閱讀了哈德利書中的函數操作符,並淹沒了R的範圍規則瘋狂的複雜性:http://adv-r.had.co.nz/Function-operators.html – grrgrrbla

+0

@grrgrrbla with' Curry'來自'functional'包,你可以非常直接地使用它。請參閱下面的答案。 –

+0

謝謝:),我總是樂於學習新東西!如果你有任何鏈接或建議,在哪裏可以學到更多,那將是非常棒的! – grrgrrbla

回答

4

mutate_each函數不會將附加參數解釋爲傳遞給函數的參數。所以,一旦你將它傳遞給mutate_each,需要設置可選參數。您可以使用稱爲currying的函數式編程策略來執行此操作。本質上,您創建一個新功能,其中缺省值optionalParam1已更改。您可以使用Curry函數從functional包中完成此操作。

aFunction <- function(x, optionalParam1="abc"){ 
    cat(optionalParam1, "\n") 
    return(x) 
} 

myFun <- function(data, ...){ 
    require(functional) 
    special_aFunction = Curry(aFunction, ...) 
    result <- data %>% mutate_each(funs(special_aFunction)) 
} 

> data = data.frame(c1=c(1,2,3), c2=c(1,2,3)) 
> myFun(data) 
abc 
abc 
> myFun(data, optionalParam1="xyz") # now works 
xyz 
xyz