函數(shù)是一組一起執(zhí)行一個任務(wù)的語句。R 語言本身提供了很多的內(nèi)置函數(shù),當(dāng)然我們也可以自己創(chuàng)建函數(shù)。
您可以把代碼劃分到不同的函數(shù)中。如何劃分代碼到不同的函數(shù)中是由您來決定的,但在邏輯上,劃分通常是根據(jù)每個函數(shù)執(zhí)行一個特定的任務(wù)來進(jìn)行的。
函數(shù)聲明告訴編譯器函數(shù)的名稱、返回類型和參數(shù)。函數(shù)定義提供了函數(shù)的實際主體。
R 語言中函數(shù)是一個對象,可以擁有屬性。
R 語言中的函數(shù)定義使用 function 關(guān)鍵字,一般形式如下:
function_name <- function(arg_1, arg_2, ...) { // 函數(shù)體 }
說明:
function_name : 為函數(shù)名
arg_1, arg_2, ... : 形式參數(shù)列表
函數(shù)返回值使用 return()。
R 語言提供了很多有用的內(nèi)置函數(shù),我們無需定義它就可以直接使用。
例如:seq(), mean(), max(), sum(x) 以及 paste(...) 等。
# 輸出 32 到 44 到的所有數(shù)字 print(seq(32,44)) # 計算兩個數(shù)到平均數(shù) print(mean(25:82)) # 計算 41 到 68 所有數(shù)字之和 print(sum(41:68))
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 32 33 34 35 36 37 38 39 40 41 42 43 44 [1] 53.5 [1] 1526
我們可以自己創(chuàng)建函數(shù),用于特定到功能,定義后可以向內(nèi)置函數(shù)一樣使用它們。
下面演示兩如何自定義函數(shù):
# 定義一個函數(shù),用于計數(shù)一個系列到平方值 new.function <- function(a) { for(i in 1:a) { b <- i^2 print(b) } }
接下來我們可以調(diào)用函數(shù):
new.function <- function(a) { for(i in 1:a) { b <- i^2 print(b) } } # 調(diào)用函數(shù),并傳遞參數(shù) new.function(6)
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 1 [1] 4 [1] 9 [1] 16 [1] 25 [1] 36
我們也可以創(chuàng)建一個不帶參數(shù)的函數(shù):
new.function <- function() { for(i in 1:5) { print(i^2) } } # 調(diào)用函數(shù),不需要傳遞參數(shù) new.function()
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 1 [1] 4 [1] 9 [1] 16 [1] 25
函數(shù)參數(shù),可以按函數(shù)創(chuàng)建時的順序來傳遞,也可以不按順序,但需要指定參數(shù)名:
# 創(chuàng)建函數(shù) new.function <- function(a,b,c) { result <- a * b + c print(result) } # 不帶參數(shù)名 new.function(5,3,11) # 帶參數(shù)名 new.function(a = 11, b = 5, c = 3)
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 26 [1] 58
函數(shù)創(chuàng)建時也可以為參數(shù)指定默認(rèn)值,如果調(diào)用的時候不傳遞參數(shù)就會使用默認(rèn)值:
# 創(chuàng)建帶默認(rèn)參數(shù)的函數(shù) new.function <- function(a = 3, b = 6) { result <- a * b print(result) } # 調(diào)用函數(shù),但不傳遞參數(shù),會使用默認(rèn)的 new.function() # 調(diào)用函數(shù),傳遞參數(shù) new.function(9,5)
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 18 [1] 45
懶惰計算將推遲計算工作直到系統(tǒng)需要這些計算的結(jié)果。如果不需要結(jié)果,將不用進(jìn)行計算。
默認(rèn)情況下,R 函數(shù)對參數(shù)的計算是懶惰的,就是只有我們在計算它的時候才會調(diào)用:
f <- function(x) { 10 } f()
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 10
以上代碼執(zhí)行,并沒有報錯,雖然我們沒有傳入?yún)?shù),但函數(shù)體內(nèi)為使用參數(shù) x,所以不會去調(diào)用它,也不會報錯。
new.function <- function(a, b) { print(a^2) print(a) print(b) # 使用到 b,但未傳入,所以會報錯 } # 傳入一個參數(shù) new.function(6)
執(zhí)行以上代碼,輸出結(jié)果為:
[1] 36 [1] 6 Error in print(b) : 缺少參數(shù)"b",也沒有缺省值 Calls: new.function -> print 停止執(zhí)行