R語言函式


一個函式是組合在一起以執行特定任務的一組語句。R具有大量內建函式,當然使用者也可以建立自己的功能。

在R中,函式是一個物件,所以R直譯器能夠將控制傳遞給函式,以將引數傳遞函式完成操作。

該函式又執行其任務並將控制權返回給直譯器以及可儲存在其他物件中的任何結果。

函式定義

使用關鍵字function來建立一個R函式。R函式定義的基本語法如下:

function_name <- function(arg_1, arg_2, ...) {
   Function body 
}

函式元件

函式中有許多不同的部分,它們是 -

  • 函式名稱 - 這是函式的實際名稱。 它以R名稱作為物件儲存在R環境中。
  • 引數 - 引數是一個預留位置。呼叫函式時,將值傳遞給引數。引數是可選的; 也就是說,函式可能不包含引數。引數也可以有預設值。
  • 函式體 - 函式體包含一組語句,用於定義函式的作用。
  • 返回值 - 函式的返回值是要評估/計算的函式體中的最後一個表示式。

R具有許多內建函式,可以直接在程式中呼叫,而不必定義它們。我們還可以建立和使用自己建立的函式,稱為使用者定義函式。

內建函式

內建函式的簡單範例有:seq()mean()max()sum(x)paste(...)等。它們可在使用者編寫的程式直接呼叫。可以參考廣泛使用的R函式

# 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))

當我們執行上述程式碼時,會產生以下結果 -

[1] 32 33 34 35 36 37 38 39 40 41 42 43 44
[1] 53.5
[1] 1526

使用者自定義函式

我們可以在R中建立使用者定義的函式。它們用於實現使用者想要的功能,當建立了這些使用者自定義函式後,就可以像內建函式那樣使用。以下是如何建立和使用函式的範例 -

# Create a function to print squares of numbers in sequence.
new.function <- function(a) {
   for(i in 1:a) {
      b <- i^2
      print(b)
   }
}

呼叫函式

# 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)

當我們執行上述程式碼時,會產生以下結果 -

[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36
[1] 49
[1] 64
[1] 81
[1] 100

呼叫沒有引數的函式

# 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()

當我們執行上述程式碼時,會產生以下結果 -

[1] 100
[1] 121
[1] 144
[1] 169
[1] 196
[1] 225
[1] 256
[1] 289
[1] 324
[1] 361
[1] 400

用引數值呼叫函式(按位元置和名稱)

函式呼叫的引數可以按照函式中定義的順序提供,也可以按不同的順序提供,只需要分配給引數的名稱即可。參考以下範例程式碼 -

# Create a function with arguments.
new.function <- function(a,b,c) {
   result <- a * b + c
   print(result)
}

# 按引數的順序來提供值呼叫
new.function(10,20,30)

# 按引數的名稱來提供值呼叫
new.function(a = 10, c = 30, b = 20)

當我們執行上述程式碼時,會產生以下結果 -

[1] 230
[1] 230

使用預設引數呼叫函式

我們可以在函式定義中定義引數的值,並呼叫函式,而不提供任何引數來獲取預設結果。 但是也可以通過提供引數的新值來獲取非預設參考值來呼叫這些函式。

# 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)

當我們執行上述程式碼時,會產生以下結果 -

[1] 200
[1] 242

懶惰計算函式

函式的引數被執行懶評估/求值,這表示它們只有在函式體需要的時候進行評估/求值。

# 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)

當我們執行上述程式碼時,會產生以下結果 -

[1] 64
[1] 8
Error in print(b) : 缺少引數"b",也沒有預設值

如上所示,只有在print(b),才發現沒有提供引數b的值。所以我們在編寫程式時要注意此類問題的發生,最好給定引數b一個預設值。