函数-R 中的可选参数
Optional arguments in function-R
这是一个可重现的例子-
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)
这个方法比较灵活一点-
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"))
这是一个可重现的例子-
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)
这个方法比较灵活一点-
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"))