R 函数

函数是一段代码,只有在被调用时才会运行。

您可以将数据(称为参数)传递给函数。

函数可以作为结果返回数据。


创建函数

要创建函数,请使用 function() 关键字:

实例

my_function <- function() { # 创建一个名为 my_function 的函数
  print("Hello World!")
}

调用函数

要调用函数,请使用函数名后跟括号,例如my_function():

实例

my_function <- function() {
  print("Hello World!")
}

my_function() # 调用名为 my_function 的函数
亲自试一试 »

参数

信息可以作为参数传递给函数。

参数在函数名之后的括号内指定。 您可以添加任意数量的参数,只需用逗号分隔即可。

以下示例具有一个带有一个参数 (fname) 的函数。 当函数被调用时,我们传递一个名字,这个名字在函数内部用来打印全名:

实例

my_function <- function(fname) {
  paste(fname, "Griffin")
}

my_function("Peter")
my_function("Lois")
my_function("Stewie")
亲自试一试 »

形式参数或实际参数?

术语形式参数(parameter) 和 实际参数(argument)可用于同一事物:传递给函数的信息。

从函数的角度来看:

形式参数(parameter)是函数定义中括号内列出的变量。

实际参数(argument)是在调用函数时发送给函数的值。



参数个数

默认情况下,必须使用正确数量的参数调用函数。 这意味着如果您的函数需要 2 个参数,则必须使用 2 个参数调用该函数,而不是更多,也不是更少:

实例

此函数需要 2 个实际参数:

my_function <- function(fname, lname) {
  paste(fname, lname)
}

my_function("Peter", "Griffin")
亲自试一试 »

如果你尝试用 1 或 3 个实际参数调用函数,你会得到一个错误:

实例

这个函数需要 2 个实际参数,并得到 1 个参数:

my_function <- function(fname, lname) {
  paste(fname, lname)
}

my_function("Peter")
亲自试一试 »

默认参数值

以下示例显示如何使用默认参数值。

如果我们调用没有参数的函数,它使用默认值:

实例

my_function <- function(country = "Norway") {
  paste("I am from", country)
}

my_function("Sweden")
my_function("India")
my_function() # 将获得默认值,即 Norway (挪威)
my_function("USA")
亲自试一试 »

返回值

要让函数返回结果,请使用 return() 函数:

实例

my_function <- function(x) {
  return (5 * x)
}

print(my_function(3))
print(my_function(5))
print(my_function(9))
亲自试一试 »

上面代码的输出将是:

[1] 15
[1] 25
[1] 45

嵌套函数

创建嵌套函数有两种方式:

  • 在另一个函数中调用一个函数。
  • 在函数中编写函数。

实例

在另一个函数中调用一个函数:

Nested_function <- function(x, y) {
  a <- x + y
  return(a)
}

Nested_function(Nested_function(2,2), Nested_function(3,3))
亲自试一试 »

示例说明

函数告诉 x 添加 y。

第一个输入 Nested_function(2,2) 是主函数的"x"。

第二个输入 Nested_function(3,3) 是主函数的"y"。

因此输出为 (2+2) + (3+3) = 10

实例

在函数内写一个函数:

Outer_func <- function(x) {
  Inner_func <- function(y) {
    a <- x + y
    return(a)
  }
  return (Inner_func)
}
output <- Outer_func(3) # 调用 Outer_func
output(5)
亲自试一试 »

示例说明

您不能直接调用该函数,因为 Inner_func 已定义(嵌套)在 Outer_func 中。

我们需要先调用 Outer_func 才能调用 Inner_func 作为第二步。

我们需要创建一个名为 output 的新变量并给它一个值,这里是 3。

然后我们使用所需的"y"值打印输出,在本例中为 5。

因此输出为 8 (3 + 5)。


递归

R 也接受函数递归,这意味着定义的函数可以调用自身。

递归是一个常见的数学和编程概念。这意味着一个函数调用自己。这样做的好处是您可以遍历数据以达到结果。

开发人员应该非常小心递归,因为很容易陷入编写一个永不终止的函数,或者一个使用过多内存或处理器能力的函数。但是,如果编写正确,递归可能是一个非常高效且数学上优雅的编程方法。

在本例中,tri_recursion() 是我们定义为调用自身("recurse")的函数。我们使用 k 变量作为数据,每次递归都会递减 (-1)。当条件不大于 0(即为 0 时)时递归结束。

对于新开发人员来说,可能需要一些时间来弄清楚它是如何工作的,最好的方法是测试和修改它。

实例

tri_recursion <- function(k) {
  if (k > 0) {
    result <- k + tri_recursion(k - 1)
    print(result)
  } else {
    result = 0
    return(result)
  }
}
tri_recursion(6)
亲自试一试 »