R 语言函数

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

可以将数据(称为参数)传递到函数中。

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


创建函数

function() 关键字创建函数:

实例
  1. my_function <- function() { # create a function with the name my_function
  2. print("Hello World!")
  3. }

调用函数

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

实例
  1. my_function <- function() {
  2. print("Hello World!")
  3. }
  4. my_function()

Arguments 参数

信息可以作为 arguments 参数传递到函数中。

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

下面的实例有一个带有一个 arguments 参数(fname)的函数。调用函数时,我们传递一个名字,该名字在函数内部用于打印全名:

实例
  1. my_function <- function(fname) {
  2. paste(fname, "Griffin")
  3. }
  4. my_function("Peter")
  5. my_function("Lois")
  6. my_function("Stewie")
Parameters 还是 Arguments?

术语 "parameter" 和 "argument" 都是参数,可以用于同一件事:传递到函数中的信息。

从函数的角度:

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

argument 参数是调用函数时发送给函数的值。


Arguments 的数量

默认情况下,必须使用正确数量的参数调用函数。这意味着如果你的函数需要两个参数,你必须用两个参数调用函数,不能多,也不能少:

实例

此函数需要两个 arguments 参数,并用两个 arguments 参数调用:

  1. my_function <- function(fname, lname) {
  2. paste(fname, lname)
  3. }
  4. my_function("Peter", "Griffin")

如果你试图用 1 或 3 个参数调用函数,这样就会产生错误:

实例

此函数需要 2 个参数,但只使用 1 个参数:

  1. my_function <- function(fname, lname) {
  2. paste(fname, lname)
  3. }
  4. my_function("Peter")

默认 Parameter 参数值

下面的实例演示如何使用默认 parameter 参数值。

如果我们在没有 argument 参数的情况下调用函数,它将使用默认值:

实例
  1. my_function <- function(country = "Norway") {
  2. paste("I am from", country)
  3. }
  4. my_function("Sweden")
  5. my_function("India")
  6. my_function() # will get the default value, which is Norway
  7. my_function("USA")

返回值

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

实例
  1. my_function <- function(x) {
  2. return (5 * x)
  3. }
  4. print(my_function(3))
  5. print(my_function(5))
  6. print(my_function(9))

以上代码输出结果是:

  1. [1] 15
  2. [1] 25
  3. [1] 45

嵌套函数

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

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

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

  1. Nested_function <- function(x, y) {
  2. a <- x + y
  3. return(a)
  4. }
  5. Nested_function(Nested_function(2, 2), Nested_function(3, 3))
实例解释

该函数告诉 x 加 y。

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

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

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

实例

在函数中编写函数:

  1. Outer_func <- function(x) {
  2. Inner_func <- function(y) {
  3. a <- x + y
  4. return(a)
  5. }
  6. return (Inner_func)
  7. }
  8. output <- Outer_func(3) # To call the Outer_func
  9. output(5)
实例解释

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

我们需要先调用 Outer_func,然后再调用 Inner_func。

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

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

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


递归

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

递归是一个常见的数学和编程概念。这意味着一个函数调用自己。这样做的好处是,您可以通过循环数据来获得结果。

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

在这个例子中, tri_recursion() 是一个我们定义的叫 ("递归") 的函数。我们使用变量 k 作为数据, 每次递归时该值自减 (-1) 。当条件不大于 0 时(即当条件为 0 时),递归结束。

对于一个新手开发人员来说,可能需要一些时间来弄清楚递归到底是如何工作的,最好的办法是通过实践与测试。

实例
  1. tri_recursion <- function(k) {
  2. if (k > 0) {
  3. result <- k + tri_recursion(k - 1)
  4. print(result)
  5. } else {
  6. result = 0
  7. return(result)
  8. }
  9. }
  10. tri_recursion(6)