Day 12- 自定義函數
(前言:那個,由於本人不是專業的程式設計師,寫的內容可能不是很正確,還請大家多多包含/指教 :D)
前面十幾天的文章都是在學習如何運用函數,但是R語言不只可以讓使用者使用各式各樣的函數,也可以讓使用者創造自己的函數,加快寫程式的速度及提高方便性。
如果要寫一個自己的函數的話,首先我們要知道R語言的函數都是由一個原始碼構成的,因此,寫一個自訂函數就等於寫一個函數的原始碼。如果要看一個函數的原始碼的話,在console裡面打上函數,不加任何符號,就可以檢視函數的原始碼。例:
現在就來寫一個屬於自己的函數吧!
在R語言裡,要寫一個自訂函數要照下面的規則走:
函數名稱 <- function(引數1, 引數2){
R應該怎麼操作這些引數/吐出什麼結果
}
用範例來看的話,第一個要寫的函數是類似於print
的函數,我們姑且稱這個函數為kirbyisthebest
,引數為x,在大括弧裡面寫上x,代表R要吐出x結果。程式碼如下列:
kirbyisthebest <- function(x) {
x
}
第二個學的是計算向量平均的函數,我們這次叫它kirbsvector
。第一行的寫法跟前面的例子一樣,只是我們要在大括號裡面改變一下我們要R做的事情,這邊我們可以用sum(c(x))/length(c(x))
(向量總和除向量長度),例:
kirbsvector <- function(x) {
sum(c(x))/length(c(x))
}
第三是計算餘數(Remainder)的函數,我們把這個函數叫做kirbsremainder
,但是,這次的寫法就有點不同了,我們可以先看下面的範例:
kirbsremainder <- function(num, divisor = 3) {
num%%divisor
}
kirbsremainder函數的寫法是:第一行指定新函數名稱,後面接上function
函數,函數中有兩個引數,num
和divisor
,並且已經先把divisor
定為3了,接下來我們在大括弧中要R找出num
除以divisor
之後的餘數(%%為計算餘數的符號)
執行這個函數的時,其實還是可以個別指定每個引數的值,這時候就不用太在意函數中引數的位置,例:
以上三種自定函數的執行結果截圖:
接下來要建立的函數裡面還包含了一個函數。對,沒錯,函數其實也可以自己變成一個引數喔,詳情請見下面的例子:
kirbsfunction <- function(func, dat) {
func(dat)
}
這邊可以看到,我們直接把func
當作一個函數了,而dat
是func
的引數。(其實就是把一個函數包在另外一個函數裡面),使用範例如下:
前面已經學習到正式的自訂函數的寫法了,這邊補充一個比較簡易版本的自訂函數。R語言的簡易版本自訂函數寫法如下:
函數名稱(function(引數){引數操作指示}, 資料)
。範例:kirbsfunction(function(x){x}, c(8,4,0))
在一個自訂函數裡面是可以用省略號的,假設我們今天要構成一個句子:[名詞] is the best,我們可以用自訂函數來寫:(paste是用來連接不同字串的函數)
thebest <- function(...) {
paste(..., "is", "the", "best")
}
執行這段程式碼後,我們可以在console裡面執行這個函數,執行方式如下列:thebest("kirby")
,執行結果為:[1] "kirby is the best"
如果一個自定函數裡面有太多省略號的話,可以把省略號弄成一個list(如果我沒有理解錯這段程式碼的意思的話),然後,可以透過下列方法執行:
wholesomekirby <- function(...) {
args <- list(...) #把省略號放到list函數,再賦值到一個變數上
personalpronoun <- args[["personalpronoun"]]
transition <- args[["transition"]]
paste(personalpronoun, "love", "kirby", transition, "kirby is the best")
}
今天的自定函數就學到這邊吧
明天繼續學apply家族函數, lappy和sapply :D