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...