我使用dplyr
中的R
包。使用我想创建一个像
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
获得相同的结果?
答案 0 :(得分: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