雖然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.比較運算子 運算子描述 示例 等於 不等於 不...