08

函数进阶

作用域、闭包与函数式编程

基础篇

灵活的语法

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

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

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

方法1:

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

方法2:

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

方法3:

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

方法4:

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

方法5:

R
mysquare <- function(x) x^2

多个参数

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


sum_two(num1 = 1, num2 = 2)
sum_two(12, 9)

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

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

条件语句

使用 if-else 语句

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

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

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


square_if("a")
square_if(3)

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

R
sum_two("a", "b")

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

R
check_number <- function(x) {
  if (x &lt; 0) {
    print("Negative number")
  } else if (x &gt; 0) {
    print("Positive number")
  } else {
    print("Zero")
  }
}


x <- 0
check_number(x)

返回多个结果

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

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

或者

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

更多

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

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

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

R
x <- c(2, 3, 4.5)
x

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

R
enlarge_icecream(multi = 100)(x)