R語言 函式的編寫

2021-07-29 07:33:18 字數 3000 閱讀 7094

r語言實際上是函式的集合,使用者可以使用base,stats等包中的基本函式,也可以自己編寫函式完成一定的功能。但是初學者往往認為編寫r函式十分困難,或者難以理解。這裡對如何編寫r函式進行簡要的介紹。

函式是對一些程式語句的封裝。換句話說,編寫函式,可以減少人們對重複**書寫,從而讓r指令碼程式更為簡潔,高效。同時也增加了可讀性。乙個函式往往完成一項特定的功能。例如,求標準差sd,求平均值,求生物多樣性指數等。r資料分析,就是依靠呼叫各種函式來完成的。但是編寫函式也不是輕而易舉就能完成的,需要首先經過大量的程式設計訓練。特別是對r中資料的型別,邏輯判別、下標、迴圈等內容有一定了解之後,才好開始編寫函式。 對於初學者來說,最好的方法就是研究現有的r函式。因為r程式包都是開源的,所有**可見。研究現有的r函式能夠使程式設計水平迅速提高。

r函式無需首先宣告變數的型別,大部分情況下不需要進行初始化。乙個完整的r函式,需要包括函式名稱,函式宣告,函式引數以及函式體幾部分。

1. 函式名稱,即要編寫的函式名稱,這一名稱就作為將來呼叫r函式的依據。

2. 函式宣告,包括 <- function, 即宣告該物件的型別為函式。

3. 函式引數,這裡是輸入的資料,函式引數是乙個虛擬出來的乙個物件。函式引數所等於的資料,就是在函式體內部將要處理的值,或者對應的資料型別。 函式體內部的程式語句進行資料處理,就是對引數的值進行處理 ,這種處理只在呼叫函式的時候才會發生。函式的引數可以有多種型別。r help的介面對每個函式,及其引數的意義及所需的資料型別都進行了說明。

4. 函式體

常常包括三部分.

(1). 異常處理

輸入的資料不能滿足函式計算的要求,或者型別不符, 這時候一定要設計相應的機制告訴使用者,輸入的資料在什麼地方有錯誤。 錯誤又分為兩種。

第一種, 如果輸入的資料錯誤不是很嚴重,可以經過轉換,變為符合處理要求的資料時, 此時只需要給使用者乙個提醒,告知資料型別不符,但是函式本身已經 進行了相應的轉換。

第二種,資料完全不符合要求,這種情況下,就 要終止函式的執行,而告知因為什麼,函式不能執行。這樣,使用者在 使用函式的情況先才不至於茫然。

(2). 運算過程

包括具體的運算步驟。 運算過程和該函式要完成的功能有關。

運算過程中,需要大量用到if等條件作為判別的標準。if和while都是需要資料true/false這樣的邏輯型別變數,這就意味著,if內部,往往是對條件的判別,例如 is.na, is.matrix, is.numeric等等,或者對大小的比較,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if後面,如果是1行,則花括號可以省略,否則就必須要將所有的語句都放在花括號中。這和迴圈是一致的。

例子1

## if與條件判斷

fun.test <- function(a, b, method = "add")

if(method == "subtract")

return(res) ## 返回值

}

### 檢驗結果

fun.test(a = 10, b = 8, method = "add")

fun.test(a = 10, b = 8, method = "substract")

for迴圈有些時候是必須要用到的,for迴圈內部,往往需要用下標,訪問資料內的一定元素,例如向量內的元素,這時候用方括號表示。一維的資料組合,或者陣列,常常稱為向量。二維的資料組合,往往稱為矩陣,或者資料框。具體的訪問方式主要是方括號內部有沒有逗號的區別。for迴圈或者while迴圈有時候讓人覺得比較困惑,可能需要專門的時間進行講解。

例2

### for迴圈與演算法

test.sum <- function(x)

return(res)

}

### 檢驗函式

a <- c(1,2,1,6,1,8,9,8)

test.sum(a)

sum(a)

無論是什麼樣的函式,演算法才是最關鍵的。往往需要巧妙得設計演算法,讓函式快捷高效。

(3). 返回值。

返回值就是函式給出的結果。打個比方,編寫乙個函式,就像自己攢乙個機器,例如現在攢好 一台豆漿機,該豆漿機要求輸入大豆,輸入的大豆就是引數, 返回的結果,就是豆漿。如果該豆漿機需要不停地輸入大豆, 而不能產出豆漿,這樣的機器就一定會被扔掉。函式也是一樣的, 需要給出返回值。 r中預設的情況是將最後一句作為返回值。但是為了函式的可讀性起見,應該盡量指名返回值。返回值用return()函式給出。 函式在內部處理過程中,一旦遇到return(),就會終止執行, 將return()內的資料作為函式處理的結果給出。

下面舉例說明r函式的編寫方法。

例3 計算標準差

sd2 <- function(x)

# 異常處理,當僅輸入乙個資料的時候,告知不能計算標準差

if(length(x) == 1)

## 初始化乙個臨時向量,儲存迴圈的結果,

## 求每個值與平均值的平方

x2 <- c()

## 求該向量的平均值

meanx <- mean(x)

## 迴圈

for(i in 1:length(x))

## 求總平方和

sum2 <- sum(x2)

# 計算標準差

sd <- sqrt(sum2/(length(x)-1))

# 返回值

return(sd)

}

## 程式的檢驗

## 正常的情況

sd2(c(2,6,4,9,12))

## 乙個數值的情況

sd2(3)

## 輸入資料不為數值型別時

sd2(c("1", "2"))

這樣,乙個完整的函式就編寫完成了。當然,實際情況下,函式往往更為複雜,可能要上百行。但是好的程式設計人員往往將複雜的函式編寫成小的函式。以便於程式的修改和維護,即使其中出現錯誤,也很好修改。

再有就是編寫r函式時一定要注意縮排,編輯器用notepad++, tinnr, rstudio等,同時用等距字型(如consolas, courier new等)和語法高亮顯示。這樣便於快速尋找到其中的錯誤。

(R語言)編寫自己的函式

10.1 函式的定義 name function arg 1,arg 2,expression expression是乙個r表示式 通常是表示式語句組 並使用引數arg i來計算出乙個數值,表示式的值就是函式的返回值。函式呼叫的形式通常都是name expr1,expr2,10.2 定義新的二元操作...

R語言 編寫自定義函式

r語言實際上是函式的集合,使用者可以使用base,stats等包中的基本函式,也可以編寫自定義函式完成一定的功能 乙個函式的結構大致如下所示 myfunction function arglist 其中,myfunction為函式名稱,arglist為函式中的引數列表,大括號 內的語句為函式體,函式...

R函式編寫基礎

編寫函式 第一部分 1 print str 列印函式,列印出字元內容 2 sprintf hello,s yjz s是佔位符,3 函式引數以及函式呼叫 hello.persion function first,last 4 預設引數 hello.persion function first,last...