R语言笔记7:functions——编写函数所需的基础知识
上一講通過三個(gè)簡單的例子體驗(yàn)了一下如何在R中寫函數(shù),下面來詳細(xì)學(xué)習(xí)有關(guān)R語言中函數(shù)的知識。
Functions in R
主要分三個(gè)部分來講解函數(shù):
- 編寫函數(shù)所需的基礎(chǔ)知識
- 相關(guān)語法作用域
- R語言作用域的規(guī)則
編寫函數(shù)所需的基礎(chǔ)知識
R語言通過function()指令來命名和創(chuàng)建函數(shù)。首先要給函數(shù)賦值,也就是命名,然后在小括號中寫入?yún)?shù),最后再大括號中寫入函數(shù)要執(zhí)行的語句,其基本語法是:
f <- function(<arguments>){## Do something interesting }同時(shí)在R中,你可以將函數(shù)作為參數(shù)傳遞給其他函數(shù),即嵌套。
函數(shù)的返回值是函數(shù)執(zhí)行部分中的最后一行表達(dá)式。
編寫函數(shù)的過程中我們可以設(shè)置和命名參數(shù),這些參數(shù)可以代表數(shù)值、矩陣、數(shù)據(jù)框或邏輯值等等。同時(shí)也可以設(shè)置一些具有缺省值(默認(rèn)值)的參數(shù)。
- 形式參數(shù)(formal arguments)
形式參數(shù)是包含在函數(shù)定義里的參數(shù)。
formals()會將一個(gè)函數(shù)作為輸入(input),并返回函數(shù)所有的形式參數(shù)組成的列表。
在R中,不是所有命令都用到所用的形式參數(shù)。加入一個(gè)函數(shù)中設(shè)置了10個(gè)參數(shù),但我們往往并不需要指定每個(gè)參數(shù)的值是啥,所以函數(shù)可以缺失某些參數(shù)。當(dāng)沒有明確賦值是,它的取值就是缺省值(默認(rèn)值,default value)
- 匹配參數(shù)(argument matching)
可以根據(jù)位置或名稱來匹配函數(shù)參數(shù),這是編寫和調(diào)用函數(shù)的關(guān)鍵。
以計(jì)算數(shù)據(jù)標(biāo)準(zhǔn)差的函數(shù)sd()為例。
> data <- rnorm(100) ## 取100個(gè)符合正態(tài)分布的隨機(jī)數(shù) > sd(x = data) ## 給參數(shù)賦值 求標(biāo)準(zhǔn)差 [1] 1.035329 > sd(data) ## 給參數(shù)默認(rèn)賦值 [1] 1.035329 > sd(data, na.rm = FALSE) [1] 1.035329 > sd(na.rm = FALSE, data) ## 調(diào)換參數(shù)位置后結(jié)果不變 [1] 1.035329以上所有表達(dá)式都是等價(jià)的,但是最好不要調(diào)換參數(shù)位置。
如果函數(shù)中參數(shù)較多,那么最好使用位置匹配。
比如lm()函數(shù)(把數(shù)據(jù)擬合到線性模型),它的參數(shù)列表這么長:
> args(lm) function (formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...) NULL前五個(gè)參數(shù)都沒有缺省值,依次是,公式、數(shù)據(jù)、子集、權(quán)重等。這里使用者必須要指定他們的值。
lm(y ~ x, mydata, 1:100, model = FALSE)大多數(shù)情況下,我們不知道參數(shù)的具體位置,所以在命令行中,命名參數(shù)來匹配最安全。
The order of operations when given an argument is:
- 惰性求值(Lazy Evaluation)
惰性求值是R語言的一個(gè)關(guān)鍵特性,也是許多編程語言常用的模型。僅在使用函數(shù)參數(shù)時(shí)對其求值。
第一個(gè)例子:
> f <- function(a, b) { + a^2 + } > f(2) [1] 4這里定義函數(shù)f,有兩個(gè)參數(shù),但返回值僅僅是a的平方。所以當(dāng)運(yùn)行f(2)時(shí),和b無關(guān),所以系統(tǒng)自動跳過,不會報(bào)錯(cuò)。
第二個(gè)例子:
> f <- function(a, b) { + print(a) + print(b) + } > f(45) [1] 45 Error in print(b): argument "b" is missing, with no default這里同樣定義f有兩個(gè)參數(shù),但返回值是a和b,所以當(dāng)輸入f(45)時(shí),因?yàn)榈诙€(gè)位置上缺少b的賦值,所以會報(bào)錯(cuò)。這里就是用了惰性求值,即,僅在使用這個(gè)參數(shù)的時(shí)候進(jìn)行求值,在這之前的程序都是有效的并可以執(zhí)行,直至運(yùn)行到出錯(cuò)的部分。
- 特殊參數(shù)...
...參數(shù)是一種特殊的參數(shù),表明一些可以傳遞給另一個(gè)函數(shù)的參數(shù)。常用于當(dāng)你需要擴(kuò)展另一個(gè)函數(shù),而你又不想復(fù)制原函數(shù)的整個(gè)參數(shù)列表時(shí)。
如下例,你希望修改plot()函數(shù)中的個(gè)別參數(shù),而其他參數(shù)保持不變,將其應(yīng)用于一個(gè)新定義的函數(shù)中myplot():
myplot <- function(x, y, type = "l", ...) {plot(x, y, type = type, ...) ## Pass '...' to 'plot' function }在泛型函數(shù)(generic function)中,...還有另一種用法,它的作用是根據(jù)數(shù)據(jù)類型使用合適的方法
泛型函數(shù)是一個(gè)函數(shù)族,其中的每個(gè)函數(shù)都有相似的功能,但是適用于某個(gè)特定的類。
> mean function (x, ...) UseMethod("mean") <bytecode: 0x5d5e3e8> <environment: namespace:base>還有一種情況下,...參數(shù)必須使用:
那就是,當(dāng)傳遞到函數(shù)的參數(shù)數(shù)量不能事先確定的時(shí)候。
比如paste()函數(shù),他的作用是將一連串字符串連接起來,然后新建一個(gè)字符串或向量,所以無法預(yù)知參數(shù)個(gè)數(shù):
> args(paste) function (..., sep = " ", collapse = NULL) NULL還有cat()函數(shù),它的功能是和paste相似,也是連接字符串。
> args(cat) function (..., file = "", sep = " ", fill = FALSE, labels = NULL, append = FALSE) NULL使用...函數(shù)的一個(gè)注意事項(xiàng):
就是任何出現(xiàn)在...之后的參數(shù)列表必須明確的給出名稱。而且不能夠部分匹配或位置匹配
舉例:
> paste("a","b",sep = ":") [1] "a:b"不能位置匹配或部分匹配:
> paste("a","b",":") [1] "a b :" > paste("a","b",se = ":") [1] "a b :"參考資料:
1. 視頻課程 R Programming by Johns Hopkins University:https://www.coursera.org/learn/r-programming/home/welcome
2. 講義 Programming for Data Science :https://bookdown.org/rdpeng/rprogdatascience/R
總結(jié)
以上是生活随笔為你收集整理的R语言笔记7:functions——编写函数所需的基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新加坡汇丰个人账户分析
- 下一篇: 创客匠人年度共创峰会圆满落幕