function-R中的可选参数

时间:2018-01-18 07:28:31

标签: r function if-statement optional-parameters optional-arguments

这是一个可重现的例子 -

cars<-data.frame(mtcars)
cars_function<-function(mpg,data, parameter1, parameter2=NULL) {
   if(is.null(parameter2)) {
       a<- aggregate(mpg ~parameter1,data,mean )
       a<-round(a, digits = 0)
   } else {
       a<- aggregate(mpg ~parameter1+parameter2,data,mean)
       a<-round(a, digits = 0)
   }
}

cars_res1 <- cars_function(mpg=cars$mpg, parameter1 = cars$vs, data = cars)
cars_res2 <- cars_function(mpg=cars$mpg, parameter1 = cars$vs, parameter2 = cars$am,data = cars)

此处参数2是可选参数。使用聚合计算均值后的步骤是相同的​​,即四舍五入。在我的实际数据的情况下,我执行多个计算,之后还有其他常见的步骤(四舍五入,更改列名等),这使得代码真的很长,即使步骤是重复的。

我该如何避免?

在这种情况下,if-else都给我相同的输出,即均值。那么可以这样做吗?

cars_function1<-function(mpg,data, parameter1,parameter2=NULL){
   a <- aggregate(mpg ~parameter1+parameter2,data,mean)
   a <- round(a, digits = 0) 
}

cars_new_res1 <- cars_function1(mpg=cars$mpg, parameter1 =    cars$vs, parameter2 = NULL, data = cars) 
##It ignores parameter 2 here
cars_new_res2 <- cars_function1(mpg=cars$mpg, parameter1 = cars$vs, parameter2 = cars$am, data = cars)

1 个答案:

答案 0 :(得分:1)

这种方法更灵活一点 -

cars_function<-function(data,y,x){
  f <- as.formula(paste(y,"~", paste(x, collapse="+")))
  a <- aggregate(f,data,mean)
  a <- round(a, digits = 0) 
}

out1 <- cars_function(data=mtcars,y="mpg",x=c("vs"))
out2 <- cars_function(data=mtcars,y="mpg",x=c("vs","am"))