1. if…else 語句
決策是編程的重要組成部分侠驯。 可以在R中使用條件if...else
語句來實(shí)現(xiàn)決策脐恩。
if 語句
其語法為:
if (test_expression) {
statement
}
如果test_expression
的計(jì)算結(jié)果為TRUE
镐侯,則大括號(hào)中的語句會(huì)被執(zhí)行;但是如果是FALSE
驶冒,則大括號(hào)中的語句不會(huì)被執(zhí)行苟翻。
其流程圖為:
來看個(gè)例子:
x <- 5
if(x > 0) {
print("Positive number")
}
輸出為:
[1] "Positive number"
在這里,test_expression
也可以是邏輯或數(shù)字向量骗污,但只會(huì)考慮第一個(gè)元素崇猫,并給出警告。
如果是數(shù)字向量需忿,其中只有0
表示為FALSE
邓尤,其余都表示為TRUE
。看個(gè)例子:
x <- c(-1, 0)
if(x) {
print("Non zero")
}
輸出為:
[1] "Non zero"
Warning message:
In if (x) { : 條件的長度大于一汞扎,因此只能用其第一元素
if...else 語句
其語法為:
if (test_expression) {
statement1
} else {
statement2
}
else
部分是可選的季稳,只有在test_expression
的結(jié)果為FALSE
時(shí),else
內(nèi)的語句才會(huì)被執(zhí)行澈魄。
注意景鼠,else
必須與if
語句后面的大括號(hào)位于同一行。
其流程圖為:
來看個(gè)例子:
x <- -5
if(x > 0){
print("Non-negative number")
} else {
print("Negative number")
}
輸出為:
[1] "Negative number"
上面的條件也可以如下寫成一行:
if(x > 0) print("Non-negative number") else print("Negative number")
R的這個(gè)特性允許我們像下面這樣編寫構(gòu)造:
> x <- -5
> y <- if(x > 0) 5 else 6
> y
[1] 6
if…else if...else 語句
其語法為:
if ( test_expression1) {
statement1
} else if ( test_expression2) {
statement2
} else if ( test_expression3) {
statement3
} else {
statement4
}
根據(jù)test_expressions
痹扇,只會(huì)執(zhí)行其中的一條語句铛漓。
來看個(gè)例子:
x <- 0
if (x < 0) {
print("Negative number")
} else if (x > 0) {
print("Positive number")
} else {
print("Zero")
}
輸出為:
[1] "Zero"
嵌套的 if...else 語句
我們可以在if ...else
語句中包含另一個(gè)if ...else
語句,稱為嵌套鲫构。
直接來看個(gè)例子:
x <- -2
if (x <= 0) {
if(x==0){
print("Zero")
} else {
print("Negative number")
}
} else {
print("Positive number")
}
輸出為:
[1] "Negative number"
2. ifelse 函數(shù)
向量是R語言的最基本單元浓恶。
R中的大多數(shù)函數(shù)都將向量作為輸入,并且輸出結(jié)果也是向量结笨。
函數(shù)的這種矢量化比將相同的函數(shù)分別應(yīng)用于向量的每個(gè)元素要快得多包晰。
與這個(gè)概念類似,在R中有一個(gè)if ...else
語句的向量等價(jià)形式炕吸,即ifelse()
函數(shù)伐憾。
其語法為:
ifelse(test_expression, x, y)
在這里,test_expression
必須是邏輯向量(或可以強(qiáng)制為邏輯的對(duì)象)赫模。返回值也是一個(gè)向量树肃,且其長度與test_expression
相同。
如果test_expression
的對(duì)應(yīng)值為TRUE
瀑罗,則返回的向量具有x
的元素胸嘴,如果test_expression
的對(duì)應(yīng)值為FALSE
,則返回具有y
的元素斩祭。
這就是說筛谚,如果test_expression
是TRUE
,結(jié)果的第i
個(gè)元素將是x[i]
停忿,否則它將取y[i]
的值驾讲。
來看個(gè)例子:
> a <- c(5, 7, 2, 9)
> ifelse(a %% 2 == 0, "even", "odd")
[1] "odd" "odd" "even" "odd"
在上面的示例中,test_expression
是a %% 2 == 0
席赂,它將給出向量(FALSE, FALSE, TRUE, FALSE)
吮铭。
后面兩個(gè)參數(shù)將自動(dòng)擴(kuò)充到相同長度,變?yōu)椋?("even", "even", "even", "even")
和("odd", "odd", "odd", "odd")
颅停。因此當(dāng)test_expression
的對(duì)應(yīng)值為TRUE
時(shí)谓晌,會(huì)取"even"
,否則取"odd"
癞揉。
3. for 循環(huán)
for
循環(huán)用于遍歷向量中的所有元素纸肉。
其語法為:
for (val in sequence)
{
statement
}
這里的sequence
是一個(gè)向量溺欧,而val
在循環(huán)過程中依次取sequence
中每個(gè)值。在每次迭代中柏肪,都會(huì)執(zhí)行statement
語句姐刁。
其流程圖為:
下面是一個(gè)計(jì)算向量中偶數(shù)個(gè)數(shù)的例子:
x <- c(2, 5, 3, 9, 8, 11, 6)
count <- 0
for (val in x) {
if(val %% 2 == 0) count = count + 1
}
print(count)
輸出為:
[1] 3
在上面的示例中,由于向量x
具有7
個(gè)元素烦味,因此循環(huán)迭代了7
次聂使。
在每次迭代中,val
取x
對(duì)應(yīng)元素的值谬俄。
我們使用了一個(gè)計(jì)數(shù)器來計(jì)算x
中偶數(shù)的個(gè)數(shù)柏靶。我們可以看到向量x
包含3
個(gè)偶數(shù)。
4. while 循環(huán)
在R中溃论,while
循環(huán)用于循環(huán)直到特定條件不滿足為止屎蜓。
其語法為:
while (test_expression)
{
statement
}
如果test_expression
的評(píng)估結(jié)果為TRUE
,則進(jìn)入到循環(huán)的主體钥勋。
執(zhí)行主體中的語句炬转,執(zhí)行完后流程返回,再次評(píng)估test_expression
笔诵。
重復(fù)此過程,直到test_expression
評(píng)估結(jié)果為FALSE
為止姑子,循環(huán)退出乎婿。
其流程圖為:
看個(gè)例子:
i <- 1
while (i < 6) {
print(i)
i = i + 1
}
輸出為:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
在上面的示例中,i
被初始化為1
街佑。
在這里谢翎,test_expression
是i < 6
,由于1
小于6
沐旨,因此評(píng)估為TRUE
森逮。因此,執(zhí)行了循環(huán)的主體打印i
并遞增了i
磁携。
i
的增加很重要褒侧,這樣最終將滿足退出循環(huán)條件。否則谊迄,將導(dǎo)致無限循環(huán)闷供。
在下一次迭代中,i
的值變?yōu)?code>2统诺,循環(huán)繼續(xù)進(jìn)行歪脏。
這將一直持續(xù)到i
取值為6
。條件6 < 6
將給出FALSE
粮呢,因此while循環(huán)到此結(jié)束婿失。
5. break 和 next 語句
在R中钞艇,可以使用break
或next
語句更改正常的循環(huán)順序。
break 語句
break
語句終止包含它的循環(huán)豪硅。 程序的控制權(quán)立即傳遞到循環(huán)體之外的語句哩照。
如果break
語句在嵌套循環(huán)(另一個(gè)循環(huán)內(nèi)的循環(huán))內(nèi),則break
將只會(huì)終止最里面的循環(huán)舟误。
其語法為:
if (test_expression) {
break
}
注意:break
語句也可以在if...else
語句的else
分支內(nèi)使用葡秒。
其流程圖為:
來看個(gè)例子:
x <- 1:5
for (val in x) {
if (val == 3){
break
}
print(val)
}
輸出為:
[1] 1
[1] 2
在此示例中,我們遍歷向量x
嵌溢,該向量是從1
到5
的連續(xù)數(shù)字眯牧。
在for
循環(huán)中,如果當(dāng)前值等于3
赖草,則停止循環(huán)学少。
從輸出結(jié)果可以看到,循環(huán)在遇到break
語句時(shí)終止秧骑。
next 語句
next
語句僅在當(dāng)前迭代時(shí)用于跳過循環(huán)內(nèi)的其余代碼版确。循環(huán)不會(huì)終止,會(huì)繼續(xù)進(jìn)行下一個(gè)迭代乎折。
其語法為:
if (test_condition) {
next
}
注意:next
語句也可以在if...else
語句的else
分支內(nèi)使用绒疗。
其流程圖為:
來看個(gè)例子:
x <- 1:5
for (val in x) {
if (val == 3){
next
}
print(val)
}
輸出為:
[1] 1
[1] 2
[1] 4
[1] 5
在上面的示例中,我們?cè)跅l件語句內(nèi)使用next
語句來檢查該值是否等于3
骂澄。
如果該值等于3
吓蘑,則當(dāng)前迭代停止,不會(huì)執(zhí)行后面的代碼坟冲,因此當(dāng)前不會(huì)打印值磨镶,但循環(huán)會(huì)繼續(xù)進(jìn)行下一次迭代。
上述例子的結(jié)果反映了這種情況健提。
6. repeat 循環(huán)
repeat
循環(huán)用于多次迭代代碼塊琳猫。
repeat
循環(huán)中沒有條件檢查來退出循環(huán)。因此我們必須自己將一個(gè)條件顯式地放入循環(huán)體中私痹,并使用break
語句退出循環(huán)脐嫂。如果不這樣做,將導(dǎo)致無限循環(huán)紊遵。
其語法為:
repeat {
statement
}
其流程圖為:
來看個(gè)例子:
x <- 1
repeat {
print(x)
x = x+1
if (x == 6) {
break
}
}
輸出為:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
在上面的示例中雹锣,我們使用了一個(gè)條件來檢查并在x
取值為6
時(shí)退出循環(huán)。
因此癞蚕,我們?cè)谳敵鲋锌吹絻H打印1
到5
的值蕊爵。
今天的內(nèi)容就到此為止,介紹了R中的條件和循環(huán)語句桦山,希望對(duì)大家有點(diǎn)幫助攒射。
感謝您的閱讀醋旦!想了解更多有關(guān)技巧,請(qǐng)關(guān)注我的微信公眾號(hào)“R語言和Python學(xué)堂”会放,我將定期更新相關(guān)文章饲齐。