第 8 章 函数应用

8.1 灵活的语法

我们对输入的向量每个元素计算平方,可以这样写函数

mysquare <- function(x) {
   y <- x^2
   return(y)  
}

R语言里面,完成一件事情往往有很多种方法,比如

方法1:

mysquare <- function(x) {
    return(x^2)
}

方法2:

mysquare <- function(x) { return(x^2) }

方法3:

mysquare <- function(x) return(x^2)

方法4:

mysquare <- function(x) {
    x^2
}

方法5:

mysquare <- function(x) x^2

8.2 多个参数

sum_two <- function(num1, num2) {
  sum  <- num1 + num2
  return(sum)
}


sum_two(num1 = 1, num2 = 2)
## [1] 3
sum_two(12, 9)
## [1] 21

练习:说说这个函数的意思

norm_by_y <- function(num1, num2) {
   result  <- (num1 - num2)/num2
   return(result)
}

8.3 条件语句

使用 if-else 语句

if(condition) {
   Do something
} else {
   Alternative something
}

比如,先判断是否为数值,如果是返回它的平方,如果不是数值,就返回提示语句

square_if <- function(num) {
    if (is.numeric(num)) {
      num^2
    } else {
     "Your input is not numeric."
    }
}


square_if("a")
## [1] "Your input is not numeric."
square_if(3)
## [1] 9

练习:将上面sum_two()函数增加数据类型判断语句,让函数更安全。

sum_two("a", "b")

多个条件的,就需要if-else if-else语句,比如这里判断一个数是正数、负数还是0

check_number <- function(x) {
  if (x < 0) {
    print("Negative number")
  } else if (x > 0) {
    print("Positive number")
  } else {
    print("Zero")
  }
}


x <- 0
check_number(x)
## [1] "Zero"

8.4 返回多个结果

如果要返回多个统计结果,可以把结果先放在list或者data.frame中,然后再返回。

mystat <- function(x){
   meanval <- mean(x) 
   sdval <- sd(x)
   
   list(sd = sdval, mean = meanval)
}

或者

mystat <- function(x){
   meanval <- mean(x) 
   sdval <- sd(x)
   
   data.frame(  
     sd = sdval, 
     mean = meanval
   )
}

8.5 更多

冰淇淋放大器,这个机器有很多档位,可以让冰淇淋放大指定的倍数,默认为10倍

enlarge_icecream <- function(multi = 10) {
  function(icecream) {
    icecream * multi
  }
}

等待被放大的冰淇淋的大小

x <- c(2, 3, 4.5)
x
## [1] 2.0 3.0 4.5

这个冰淇淋机器 enlarge_icecream(multi = 100)()有很多档位,可以指定放大的倍数,比如这里设定为100倍

enlarge_icecream(multi = 100)(x)
## [1] 200 300 450