一個函數(shù)是組合在一起以執(zhí)行特定任務(wù)的一組語句。R具有大量內(nèi)置函數(shù),當(dāng)然用戶也可以創(chuàng)建自己的功能。
在R中,函數(shù)是一個對象,所以R解釋器能夠?qū)⒖刂苽鬟f給函數(shù),以將參數(shù)傳遞函數(shù)完成操作。
該函數(shù)又執(zhí)行其任務(wù)并將控制權(quán)返回給解釋器以及可存儲在其他對象中的任何結(jié)果。
使用關(guān)鍵字function
來創(chuàng)建一個R函數(shù)。R函數(shù)定義的基本語法如下:
function_name <- function(arg_1, arg_2, ...) {
Function body
}
函數(shù)中有許多不同的部分,它們是 -
R具有許多內(nèi)置函數(shù),可以直接在程序中調(diào)用,而不必定義它們。我們還可以創(chuàng)建和使用自己創(chuàng)建的函數(shù),稱為用戶定義函數(shù)。
內(nèi)置函數(shù)的簡單示例有:seq()
,mean()
,max()
,sum(x)
和paste(...)
等。它們可在用戶編寫的程序直接調(diào)用??梢詤⒖?a target="_blank" title="廣泛使用的R函數(shù)">廣泛使用的R函數(shù)。
# Create a sequence of numbers from 32 to 44.
print(seq(32,44))
# Find mean of numbers from 25 to 82.
print(mean(25:82))
# Find sum of numbers frm 41 to 68.
print(sum(41:68))
當(dāng)我們執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 -
[1] 32 33 34 35 36 37 38 39 40 41 42 43 44
[1] 53.5
[1] 1526
我們可以在R中創(chuàng)建用戶定義的函數(shù)。它們用于實現(xiàn)用戶想要的功能,當(dāng)創(chuàng)建了這些用戶自定義函數(shù)后,就可以像內(nèi)置函數(shù)那樣使用。以下是如何創(chuàng)建和使用函數(shù)的示例 -
# Create a function to print squares of numbers in sequence.
new.function <- function(a) {
for(i in 1:a) {
b <- i^2
print(b)
}
}
調(diào)用函數(shù)
# Create a function to print squares of numbers in sequence.
new.function <- function(a) {
for(i in 1:a) {
b <- i^2
print(b)
}
}
# Call the function new.function supplying 6 as an argument.
new.function(10)
當(dāng)我們執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 -
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36
[1] 49
[1] 64
[1] 81
[1] 100
調(diào)用沒有參數(shù)的函數(shù)
# Create a function without an argument.
new.function <- function() {
for(i in 10:20) {
print(i^2)
}
}
# Call the function without supplying an argument.
new.function()
當(dāng)我們執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 -
[1] 100
[1] 121
[1] 144
[1] 169
[1] 196
[1] 225
[1] 256
[1] 289
[1] 324
[1] 361
[1] 400
用參數(shù)值調(diào)用函數(shù)(按位置和名稱)
函數(shù)調(diào)用的參數(shù)可以按照函數(shù)中定義的順序提供,也可以按不同的順序提供,只需要分配給參數(shù)的名稱即可。參考以下示例代碼 -
# Create a function with arguments.
new.function <- function(a,b,c) {
result <- a * b + c
print(result)
}
# 按參數(shù)的順序來提供值調(diào)用
new.function(10,20,30)
# 按參數(shù)的名稱來提供值調(diào)用
new.function(a = 10, c = 30, b = 20)
當(dāng)我們執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 -
[1] 230
[1] 230
使用默認(rèn)參數(shù)調(diào)用函數(shù)
我們可以在函數(shù)定義中定義參數(shù)的值,并調(diào)用函數(shù),而不提供任何參數(shù)來獲取默認(rèn)結(jié)果。 但是也可以通過提供參數(shù)的新值來獲取非默認(rèn)參考值來調(diào)用這些函數(shù)。
# Create a function with arguments.
new.function <- function(a = 10, b = 20) {
result <- a * b
print(result)
}
# Call the function without giving any argument.
new.function()
# Call the function with giving new values of the argument.
new.function(11, 22)
當(dāng)我們執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 -
[1] 200
[1] 242
函數(shù)的參數(shù)被執(zhí)行懶評估/求值,這表示它們只有在函數(shù)體需要的時候進(jìn)行評估/求值。
# Create a function with arguments.
new.function <- function(a, b) {
print(a^2)
print(a)
print(b)
}
# Evaluate the function without supplying one of the arguments.
new.function(8)
當(dāng)我們執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 -
[1] 64
[1] 8
Error in print(b) : 缺少參數(shù)"b",也沒有缺省值
如上所示,只有在print(b)
,才發(fā)現(xiàn)沒有提供參數(shù)b
的值。所以我們在編寫程序時要注意此類問題的發(fā)生,最好給定參數(shù)b
一個默認(rèn)值。