R語言初級(jí)教程(23): 函數(shù)

函數(shù)用于在邏輯上將我們的代碼分解成更簡(jiǎn)單的部分熏迹,這些部分易于維護(hù)和理解船响。如果代碼中需要多次重復(fù)某個(gè)操作膜宋,將其寫成函數(shù)會(huì)使代碼更簡(jiǎn)潔受啥。

1. 語法

在R中創(chuàng)建自己的函數(shù)非常簡(jiǎn)單做个,其語法為:

func_name <- function (argument) {
statement
}

可以看到:

  • R中用保留字function來聲明一個(gè)函數(shù)。

  • 花括號(hào)內(nèi)的語句構(gòu)成函數(shù)的主體滚局。 如果主體僅包含一個(gè)表達(dá)式居暖,則花括號(hào)可以不要。

  • 最后藤肢,通過將函數(shù)對(duì)象分配給變量func_name來為其命名太闺。

2. 例子

來看個(gè)例子:

pow <- function(x, y) {
# function to print x raised to the power y
result <- x^y
print(paste(x, "raised to the power", y, "is", result))
}

在這里,我們創(chuàng)建了一個(gè)名為pow()的函數(shù)嘁圈。

它有兩個(gè)參數(shù)省骂,第二個(gè)參數(shù)是第一個(gè)參數(shù)的冪,然后以適當(dāng)?shù)母袷酱蛴〗Y(jié)果最住。

我們使用了內(nèi)置函數(shù)paste()來連接字符串冀宴。

3. 調(diào)用函數(shù)

我們可以如下調(diào)用上述函數(shù):

> pow(8, 2)
[1] "8 raised to the power 2 is 64"
> pow(2, 8)
[1] "2 raised to the power 8 is 256"

這里,函數(shù)聲明中使用的參數(shù)(xy)稱為形式參數(shù)温学,而調(diào)用函數(shù)時(shí)使用的參數(shù)稱為實(shí)際參數(shù)略贮。

4. 命名參數(shù)

在上述函數(shù)調(diào)用中,形式參數(shù)與實(shí)際參數(shù)的參數(shù)匹配是按位置順序進(jìn)行。

這意味著逃延,在調(diào)用pow(8, 2)中览妖,形式參數(shù)xy分別分配了82

我們也可以使用命名參數(shù)調(diào)用該函數(shù)揽祥。

以這種方式調(diào)用函數(shù)時(shí)讽膏,實(shí)際參數(shù)的順序就無關(guān)緊要了。 例如拄丰,下面給出的所有函數(shù)調(diào)用都是等效的:

> pow(8, 2)
[1] "8 raised to the power 2 is 64"
> pow(x = 8, y = 2)
[1] "8 raised to the power 2 is 64"
> pow(y = 2, x = 8)
[1] "8 raised to the power 2 is 64"

此外府树,我們可以在單個(gè)調(diào)用中同時(shí)使用命名和未命名的參數(shù)。

在這種情況下料按,將首先匹配所有已命名的參數(shù)奄侠,然后按位置順序匹配其余未命名的參數(shù)。

> pow(x=8, 2)
[1] "8 raised to the power 2 is 64"
> pow(2, x=8)
[1] "8 raised to the power 2 is 64"

在上述所有例子中载矿,x的取值為8垄潮,y的取值為2

5. 參數(shù)的默認(rèn)值

函數(shù)中的參數(shù)也可以事先分配默認(rèn)值闷盔。

這可以通過在函數(shù)聲明中將形式參數(shù)賦予一個(gè)值來實(shí)現(xiàn)弯洗。

下面是為上述函數(shù)提供了一個(gè)默認(rèn)的y值。

pow <- function(x, y = 2) {
# function to print x raised to the power y
result <- x^y
print(paste(x,"raised to the power", y, "is", result))
}

對(duì)使用默認(rèn)值的參數(shù)逢勾,在調(diào)用時(shí)可以不提供牡整。

> pow(3)
[1] "3 raised to the power 2 is 9"
> pow(3, 1)
[1] "3 raised to the power 1 is 3"

此處,y是可選的溺拱,當(dāng)未提供y時(shí)將默認(rèn)取值為2逃贝。

6. 函數(shù)的返回值

很多時(shí)候,我們將需要使用函數(shù)進(jìn)行一些處理并返回結(jié)果盟迟。這是通過R中的return()函數(shù)來完成的秋泳。

其語法為:

return(expression)

函數(shù)的返回值可以是任何有效對(duì)象潦闲。

來看個(gè)例子:

check <- function(x) {
if (x > 0) {
result <- "Positive"
}
else if (x < 0) {
result <- "Negative"
}
else {
result <- "Zero"
}
return(result)
}

下面是一些運(yùn)行示例:

> check(1)
[1] "Positive"
> check(-10)
[1] "Negative"
> check(0)
[1] "Zero"

如果函數(shù)沒有顯式返回攒菠,則最后一個(gè)計(jì)算表達(dá)式的值將自動(dòng)返回。

例如歉闰,下面的函數(shù)等價(jià)于上面的函數(shù):

check <- function(x) {
if (x > 0) {
result <- "Positive"
}
else if (x < 0) {
result <- "Negative"
}
else {
result <- "Zero"
}
result
}

> check(2)
[1] "Positive"
> check(-3)
[1] "Negative"

我們通常使用顯式return()函數(shù)立即從函數(shù)返回值辖众。

如果return()不是該函數(shù)的最后一條語句,它將提前結(jié)束該函數(shù)和敬,程序的控制權(quán)將回到調(diào)用它的位置凹炸。

來看個(gè)例子:

check <- function(x) {
if (x>0) {
return("Positive")
}
else if (x<0) {
return("Negative")
}
else {
return("Zero")
}
}

我們來試著調(diào)用上述函數(shù):

> check(-5)
[1] "Negative"

在上面的示例中,如果x<0昼弟,該函數(shù)將立即返回Negative啤它,將不再執(zhí)行函數(shù)的其余部分。

return()函數(shù)只能返回一個(gè)對(duì)象。如果我們想返回多個(gè)值变骡,我們可以使用一個(gè)列表(或其他對(duì)象)作為返回值离赫。

下面是一個(gè)例子:

multi_return <- function() {
my_list <- list("color" = "red", "size" = 20, "shape" = "round")
return(my_list) 
}

在這里,我們創(chuàng)建一個(gè)包含多個(gè)元素的列表my_list并返回這個(gè)列表塌碌。試一下這個(gè)函數(shù):

> a <- multi_return()
> a$color
[1] "red"
> a$size
[1] 20
> a$shape
[1] "round"

今天關(guān)于函數(shù)的內(nèi)容就介紹到這渊胸,希望對(duì)大家有點(diǎn)幫助。

感謝您的閱讀台妆!想了解更多有關(guān)技巧翎猛,請(qǐng)關(guān)注我的微信公眾號(hào)“R語言和Python學(xué)堂”,我將定期更新相關(guān)文章接剩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末切厘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搂漠,更是在濱河造成了極大的恐慌迂卢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桐汤,死亡現(xiàn)場(chǎng)離奇詭異而克,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怔毛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門员萍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拣度,你說我怎么就攤上這事碎绎。” “怎么了抗果?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵筋帖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我冤馏,道長(zhǎng)日麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任逮光,我火速辦了婚禮代箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涕刚。我一直安慰自己嗡综,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布杜漠。 她就那樣靜靜地躺著极景,像睡著了一般察净。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盼樟,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天塞绿,我揣著相機(jī)與錄音,去河邊找鬼恤批。 笑死异吻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喜庞。 我是一名探鬼主播诀浪,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼延都!你這毒婦竟也來了雷猪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤晰房,失蹤者是張志新(化名)和其女友劉穎求摇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殊者,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡与境,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猖吴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摔刁。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖海蔽,靈堂內(nèi)的尸體忽然破棺而出猜扮,到底是詐尸還是另有隱情狂塘,我是刑警寧澤欢唾,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布点把,位于F島的核電站,受9級(jí)特大地震影響幌衣,放射性物質(zhì)發(fā)生泄漏矾削。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一泼掠、第九天 我趴在偏房一處隱蔽的房頂上張望怔软。 院中可真熱鬧垦细,春花似錦择镇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春吝梅,著一層夾襖步出監(jiān)牢的瞬間虱疏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工苏携, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留做瞪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓右冻,卻偏偏與公主長(zhǎng)得像装蓬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纱扭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容