iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
自我挑戰組

新手 R 語言學習紀錄系列 第 12

Day 12- R語言 自定義函數

  • 分享至 

  • xImage
  •  

Day 12- 自定義函數
(前言:那個,由於本人不是專業的程式設計師,寫的內容可能不是很正確,還請大家多多包含/指教 :D)

前面十幾天的文章都是在學習如何運用函數,但是R語言不只可以讓使用者使用各式各樣的函數,也可以讓使用者創造自己的函數,加快寫程式的速度及提高方便性。


如果要寫一個自己的函數的話,首先我們要知道R語言的函數都是由一個原始碼構成的,因此,寫一個自訂函數就等於寫一個函數的原始碼。如果要看一個函數的原始碼的話,在console裡面打上函數,不加任何符號,就可以檢視函數的原始碼。例:
https://ithelp.ithome.com.tw/upload/images/20190928/201208874Fg70St6Ts.png
現在就來寫一個屬於自己的函數吧!
在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函數,函數中有兩個引數,numdivisor,並且已經先把divisor定為3了,接下來我們在大括弧中要R找出num除以divisor之後的餘數(%%為計算餘數的符號)
執行這個函數的時,其實還是可以個別指定每個引數的值,這時候就不用太在意函數中引數的位置,例:
https://ithelp.ithome.com.tw/upload/images/20190928/2012088765Jdo2yBjD.png

以上三種自定函數的執行結果截圖:
https://ithelp.ithome.com.tw/upload/images/20190928/20120887KLe8lF9kDC.png


接下來要建立的函數裡面還包含了一個函數。對,沒錯,函數其實也可以自己變成一個引數喔,詳情請見下面的例子:

kirbsfunction <- function(func, dat) {
  func(dat)
}

這邊可以看到,我們直接把func當作一個函數了,而datfunc的引數。(其實就是把一個函數包在另外一個函數裡面),使用範例如下:
https://ithelp.ithome.com.tw/upload/images/20190928/20120887oX95Nyl34B.png

前面已經學習到正式的自訂函數的寫法了,這邊補充一個比較簡易版本的自訂函數。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


上一篇
Day 11- R語言 更多邏輯符號
下一篇
Day 13- R語言 apply家族函數、apply、lapply、 sapply
系列文
新手 R 語言學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言