函数进阶
作用域、闭包与函数式编程
基础篇灵活的语法
我们对输入的向量每个元素计算平方,可以这样写函数
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 < 0) {
print("Negative number")
} else if (x > 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)