R 函数
函数是一段代码,只有在被调用时才会运行。
您可以将数据(称为参数)传递给函数。
函数可以作为结果返回数据。
创建函数
要创建函数,请使用 function()
关键字:
实例
my_function <- function() { # 创建一个名为 my_function 的函数
print("Hello World!")
}
调用函数
要调用函数,请使用函数名后跟括号,例如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)
亲自试一试 »