從零開始學R(五) 控制語句與函式

2021-10-08 23:45:32 字數 3777 閱讀 9853

雖然r主打統計分析,但是r也是一種程式語言。雖然相比於c語言來說r的執行速度稍慢,但是r的程式設計更為方便,結構也更為豐富、

這裡將介紹兩種基本語句:條件語句與迴圈語句

上圖就是條件語句的結構示意圖,當初始值滿足某個條件時,結果則輸出y

1y_1

y1​,否則輸出y

2y_2

y2​。下面,我們以乙個例子來介紹條件語句。

>if(

258%%2==

0)[1

]"258是偶數"

>if(

258%%2==

0) print(

"258是偶數")[

1]"258是偶數"

條件語句首先要有乙個啟動命令if,所滿足的條件放在if 後面的小括號中,如果後面的語句可以寫在一行內,那麼則可以如上述第二個**編寫。如果後面的語句較多,存在跨行現象,那麼則需要用花括號將這些語句圈起來。一般的,花括號的前半個放在條件後,然後轉行再寫,表明這是乙個**塊。

當然,在前面的**中,如果條件滿足,則執行花括號中的語句,如果不滿足,這個函式不會有任何輸出,如果我們想輸出y

2y_2

y2​,就需要增加乙個語句else

>if(

259%%2==

0)else[1

]"259是奇數"

編寫上面**時需要注意,else需要放在第乙個花括號的後面,第二個花括號需要緊跟else之後。

其次,對於多個條件判斷語句,相應的寫法又會發生變化

> number 

100>

if(number <0)

else

if(number %%2==

0)else[1

]"number是正偶數"

在多重條件判斷中,我們需要加入else if來進行巢狀。另外,我們還有ifelse函式來進行向量化計算。

> vector 

99)> new.v

"未成年"

, ifelse(vector <45,

"中青年"

, ifelse(vector <65,

"中老年"

,"老年"))

)> table(new.v)

老年 未成年 中老年 中青年

351720

27

ifelse語句的編寫有以下幾個注意的地方:其一,ifelse的數量比結果數量要少乙個;其二,結果必然將所有的情況全部覆蓋,沒有丟失,沒有重複;其三函式的左右括號數量必須相等。(table()函式會將某乙個物件以**的方式呈現出來)。

根據終止的條件,迴圈語句分為兩種:for迴圈while迴圈for迴圈的終止條件是迴圈的次數,即遍歷。while迴圈的終止條件是某乙個具體標準。此外,r中還有repeat迴圈,這種迴圈沒有終止條件,是無限迴圈,如果想要終止迴圈,則需要在迴圈體內進行條件判斷,利用break退出迴圈。本節重點介紹前兩種。

for 迴圈

經典的高斯演算法,即等差數列的求和,我們有公式

s n=

12n(

a1+a

n)s_n = \fracn(a_1 + a_n)

sn​=21

​n(a

1​+a

n​)。然而我們也可以利用for迴圈來解決這一問題。假設對乙個首項為1,尾項為100,公差為1的等差數列求和

> sum 

0>

for(i in1:

100)

> print(sum)[1

]5050

我們首先需要設定乙個結果變數sum,然後利用for迴圈,使得1到100中的每乙個數都加和到sum中,也即上述等差數列求和。這個迴圈一共執行了100次。

while 迴圈

while迴圈中需要設定乙個條件,當不滿足這個條件時,迴圈繼續,當滿足條件時,迴圈終止。還是以高斯演算法為例

> sum 

0> i

1>

while

(i <=

100)

> print(sum)[1

]5050

我們依然設定乙個結果變數sum,此外我們還設定了乙個變數i,每次迴圈,sum在原來的基礎上加上i,i在原來的基礎上加1,一直到n >100為止。由此可以看出,while迴圈中我們還需要更新i的值,而for迴圈不需要我們手動更新。

(這裡補充乙個知識點,在while迴圈中,i變數是乙個全域性變數,也即它會儲存在r的執行環境中;而for迴圈中的i是區域性變數,在迴圈結束以後就清除了,並不會儲存在執行環境中。)

雖然有迴圈的存在,但是由於迴圈過程中,計算機會對各種有用無用的變數進行處理,非常消耗計算力。因此,為了計算效率的提公升,我們應盡量使用向量化運算來節省計算力,減少運算時間。

函式命令是r語言的基石,我們進行統計計算離不開各種函式**的支援。雖然r的函式很多,但有時候我們會有自己的奇思妙想,這時候我們就需要搭建自己的函式。例如,我們想列出所有100以內的偶數

> even 

function

(n)}

return(x)

}> even(

100)[1

]246

8101214

1618

2022

2426

2830

3234[18

]363840

4244

4648

5052

5456

5860

6264

6668[35

]707274

7678

8082

8486

8890

9294

9698

100

首先,我們要將函式賦值給乙個函式名,用function命令啟動,小括號中的字母是待定引數,後跟花括號,花括號結束前需要用print()或者是return()輸出結果。比如我們想要100以內的偶數,那麼我們設計的尋找偶數函式even(),待定引數n就是100,結果就是100以內的偶數形成的乙個向量。

此外,還需要介紹的乙個內容是,r語言的函式運算遵循惰性運算的規則,也即r只會在需要的時候才會進行引數運算,如果不需要時,即使有引數的輸入,r也不會進行相應的運算;沒有相應的引數,r也不會報錯。但是如果函式中有相應引數的運算,在沒有輸入引數,且沒有設定預設值的時候,r的執行會報錯error message

當然,這裡僅僅是簡單地介紹函式的形式,其中還有其他比如預設值,引數檢測以及函式式程式設計等更進一步的技術,這裡的基本內容暫不涉及,有待以後以專題的形式再行分享。

從零開始學Python 函式

對於任何語言來說,函式都是必不可少的部分,對於python一樣如此。python中有非常多的內建函式,比如 求絕對值函式abs 求長度函式len 求總和函式sum 輸出字元函式input 等等,大家可以去官方 看一下官方文件,這裡我們就不再贅述了。我們來看一下在python中如何自定義函式和函式中的...

從零開始學R(三) 基本計算

作為一款統計軟體,r最重要的功能就是進行統計計算,這一節就和小夥伴聊一聊r的基本計算語句。r執行 時,會呼叫計算機執行記憶體完成計算任務,因此r也可以實現常用的數學四則運算以及更進一步的複雜運算。x y 加法運算 x y 減法運算 x y 乘法運算 x y 除法運算 x y 乘方 指數 運算 1 x...

從零開始學Python 五 常用函式語句和運算子

上一章我們簡單的了解了一下python的 縮排,基礎的輸出語句,多行語句和單行多行注釋,今天我們來了解下python的變數與基本資料型別,讓我們在以後的程式設計中,對各種型別瞭如指掌 1.算術運算子 運算子描述示例 加 減 乘 除 取模 冪 取整除 2.比較運算子 運算子描述 示例 等於 不等於 不...