7  什么是函数

R语言的函数是一种特殊的程序,它可以接收参数,并返回一个结果。函数的返回值是函数运行完成后返回给调用者的结果。

假设你有一个名为add()的函数,它可以接收两个数字,打印它们的差,并返回它们的和。你可以用以下代码定义这个函数:

add <- function(x, y) {
  print(x-y)
  return (x + y)
}

这个函数定义中,我们用function()关键字来定义函数,然后在括号内指定函数的参数,在花括号内指定函数的运算过程。最后,我们使用return()函数来指定函数的返回值。

在这个例子中,函数add()的两个参数分别是xy,返回值是它们的和。你可以用以下代码来调用这个函数:

result <- add(3, 5)
[1] -2

在这里,我们将3和5作为参数传递给函数add(),然后将它们相加,并将结果保存到变量result中。

7.1 函数的构成要素

一个函数通常由以下几个要素构成:

  1. 函数名:这是函数的标识符,用于调用函数。

  2. 参数(或形参):这是函数的输入,函数在执行时需要根据参数进行计算。

  3. 函数体:这是函数执行的代码块,包含了函数所要完成的操作。

  4. 返回值(或实参):这是函数的输出,函数执行完成后会返回一个值。

这些要素构成了一个完整的函数,它们各自扮演着不同的角色,协同工作以完成函数的目标。

例如,如果你要定义一个函数来计算数据集的平均值,那么可以这样写:

mean <- function(x) {
  sum = sum(x)
  n = length(x)
  return(sum / n)
}

这个函数的名称是mean,它有一个参数x,函数体中包含了计算平均值的代码,最后会返回计算结果。

7.2 R语言函数的分类

R语言中的函数可以分为几大类:

  1. 基础包中的函数:这些函数是R语言的内置函数,包括常见的数学运算、统计分析、数据处理和可视化等操作。例如,mean()函数可以计算数据集的平均值,plot()函数可以绘制数据的图形。

  2. 包中的函数:R语言中有许多第三方包,这些包提供了额外的函数和功能。例如,ggplot2包提供了用于绘制复杂图形的函数,dplyr包提供了高效的数据处理函数。要使用这些函数,需要先安装并加载相应的包。

  3. 用户自定义函数:这些函数是用户自己定义的,用于执行特定的任务。例如,如果你有一个复杂的分析流程,可以将这个流程封装成一个函数,以便在需要时调用。

7.3 函数示例

如下代码定义了一个名叫f1的函数,作用是打印两个数的和,返回两个数的差。

f1 <- function(x, y) {
  print(x + y)
  return (x - y)
}

在这个例子中,我们使用print()函数打印出两个数的和,并使用return()函数返回两个数的差。

你可以用以下代码来调用这个函数:

result <- f1(3, 5)
[1] 8
result
[1] -2

在这里,我们将3和5作为参数传递给函数f1(),然后函数会先打印出两个数的和,再返回两个数的差。执行完这个代码后,变量result的值为-2。

7.4 定义函数可以不写return吗?

是的,在R语言中,定义函数时可以不写return()函数。如果函数没有使用return()函数指定返回值,则函数会自动返回最后一个计算结果作为返回值。例如,假设你有一个名为add()的函数,它可以接收两个数字,并返回它们的和。你可以用以下代码定义这个函数:

add <- function(x, y) {
 x + y
}

在这个例子中,我们省略了return()函数,直接将两个数的和作为函数的返回值。你可以用以下代码来调用这个函数:

result <- add(3, 5)
result
[1] 8

在这里,我们将3和5作为参数传递给函数add(),函数会自动返回它们的和。执行完这个代码后,变量result的值为8。

7.5 函数的调用

在R语言中,可以通过使用函数名称来调用函数。例如,要调用mean()函数,可以这样写:

mean(1:10)
[1] 5.5

当然,你也可以在调用函数时向函数传递额外的参数。例如,要计算一个数据集的中位数,可以这样写:

median(c(1:10,NA), na.rm = TRUE)
[1] 5.5

在这个例子中,我们向median()函数传递了一个参数,即na.rm = TRUE。这个参数告诉R语言在计算中位数时忽略数据集中的缺失值。

7.6 写一个计算偏度和峰度的函数

下面是一个计算偏度和峰度的函数:

skew_kurtosis <- function(x) {

  skew = sum((x - mean(x))^3) / (length(x) * sd(x)^3)

  kurtosis = sum((x - mean(x))^4) / (length(x) * sd(x)^4) - 3

  return(c(skew, kurtosis))

}

这个函数接收一个向量x作为参数,并计算x的偏度和峰度。计算完成后,会将结果放在一个向量中返回。

例如,要计算一个数据集的偏度和峰度,可以这样写:

  skew_kurtosis(1:10)
[1]  0.000000 -1.561636

这个函数会计算data的偏度和峰度,并将结果作为向量返回。