dplyr:mutate_each 中的可选参数

dplyr: optional parameter in mutate_each

我在 R 中使用 dplyr 包。使用它我想创建一个像

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

然后像

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

调用 myFun 时,所有可选参数都应传递给 aFunction。但是错误 '...' used in an incorrect context 被抛出。

这是没有 dplyr 的相同功能,它应该可以正常工作...

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

如何才能获得与 dplyr 相同的结果?

mutate_each 函数根本不将附加参数解释为传递给函数的参数。因此,一旦将其传递给 mutate_each,就需要设置可选参数。您可以使用称为 currying 的函数式编程策略来完成此操作。本质上,您创建了一个新函数,其中更改了 optionalParam1 的默认值。您可以使用 functional 包中的 Curry 函数来执行此操作。

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