14.1 簡介
函數(shù)是R中重要的組成部分,也是成為一個(gè)熟練使用R的科研工作者必備的技能。本章將為大家介紹關(guān)于R函數(shù)的部分。
函數(shù)具有以下三個(gè)優(yōu)點(diǎn):
- 可以給函數(shù)命名一個(gè)有意義的名字,這樣可以讓代碼看起來更加清晰明了;
- 如果需要修改代碼,這樣僅需修改一處即可,無須修改多處;
- 消除復(fù)制粘貼過程中的無心之失,可以減少因?yàn)榭村e(cuò)或者想錯(cuò)所帶來的失誤。
函數(shù)具有風(fēng)格性和簡潔性
一個(gè)好的函數(shù)是可以讓讀者可以讀懂,并且可以進(jìn)行操作。所以必要的注釋是必不可少的。
14.2什么時(shí)候應(yīng)該使用函數(shù)
在書中,作者舉了一個(gè)關(guān)于簡單數(shù)值計(jì)算的例子。
簡單解釋一下書中的函數(shù)及參數(shù)
- tibble函數(shù) 是可以創(chuàng)建一個(gè)數(shù)據(jù)框或者一個(gè)list;
- na.rm 參數(shù) a logical indicating whether missing values should be removed.
那么這個(gè)代碼就很明了了 意思就是將每列的值調(diào)整為0-1之間。也就是這個(gè)是將數(shù)據(jù)進(jìn)行 正則化(regularization)(x-min/R)
- 極差的英文是Range,所以后文中用了這個(gè)函數(shù)。
- Range函數(shù)會(huì)返回兩個(gè)值,也就是最大值和最小值。因?yàn)闃O差就是最大值減去最小值。
如果你上述的信息都理解了,我相信對(duì)于P187頁的函數(shù)你也能理解了。如果不知道0,5,10如何計(jì)算出的返回值,你可以像我一樣將X值帶入進(jìn)上述的函數(shù)。這樣你不僅會(huì)理解了函數(shù),也會(huì)理解了運(yùn)算的過程。
創(chuàng)建函數(shù)需要以下三個(gè)重要組成
- 一個(gè)函數(shù)名稱 也就是<-左邊的名稱
- 一個(gè)或者幾個(gè)輸入?yún)?shù),像書上的函數(shù)里面就一個(gè)輸入值 那就是df$a
- 還需要一個(gè)函數(shù)體,也就是計(jì)算參數(shù)的代碼
人與計(jì)算機(jī)函數(shù)
這塊主要是講函數(shù)名稱的命名、規(guī)范及易讀性。
- 切記名字太短,或者使用acbc等命名
- 使用簡單的—將名字隔開,使名字更加清晰
- 表達(dá)清楚所寫函數(shù)的意義
if函數(shù)的使用
if(condition) {
條件為真時(shí)執(zhí)行的代碼
} else{
條件為假時(shí)執(zhí)行的代碼 }
注意 condition應(yīng)該返回值為T or F 不應(yīng)該為NA或者一個(gè)向量
簡單使用一下
> x=10
10
if (x>0){
x=x+1
} else{
print(x)}
> x
[1] 11
升級(jí)版
> has_name <- function(x) {
+ nms <- names(x) #查看數(shù)據(jù)的名字
+ if (is.null(nms)) { #判斷nms是不是null值
+ rep(FALSE, length(x)) 如果是則復(fù)制FLASE 重復(fù)x個(gè)
+ } else {如果不是
+ !is.na(nms) & nms != "" 則判斷nms是不是缺失值和是不是等于空值
+ }
+ }
多重if值的跟這個(gè)差不多,不過if循環(huán)的太多你就該考慮換個(gè)函數(shù)了!
函數(shù)參數(shù)
函數(shù)參數(shù)要寫的完整,要選擇有意義的參數(shù)名稱,盡量選擇縮寫。