1. if…else 語句
決策是編程的重要組成部分。 可以在R中使用條件if...else語句來實現(xiàn)決策。
if 語句
其語法為:
if (test_expression) {
statement
}
如果test_expression的計算結(jié)果為TRUE,則大括號中的語句會被執(zhí)行;但是如果是FALSE,則大括號中的語句不會被執(zhí)行。
其流程圖為:

來看個例子:
x <- 5
if(x > 0) {
print("Positive number")
}
輸出為:
[1] "Positive number"
在這里,test_expression也可以是邏輯或數(shù)字向量,但只會考慮第一個元素,并給出警告。
如果是數(shù)字向量,其中只有0表示為FALSE,其余都表示為TRUE??磦€例子:
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時,else內(nèi)的語句才會被執(zhí)行。
注意,else必須與if語句后面的大括號位于同一行。
其流程圖為:

來看個例子:
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ò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,只會執(zhí)行其中的一條語句。
來看個例子:
x <- 0
if (x < 0) {
print("Negative number")
} else if (x > 0) {
print("Positive number")
} else {
print("Zero")
}
輸出為:
[1] "Zero"
嵌套的 if...else 語句
我們可以在if ...else語句中包含另一個if ...else語句,稱為嵌套。
直接來看個例子:
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)用于向量的每個元素要快得多。
與這個概念類似,在R中有一個if ...else語句的向量等價形式,即ifelse()函數(shù)。
其語法為:
ifelse(test_expression, x, y)
在這里,test_expression必須是邏輯向量(或可以強制為邏輯的對象)。返回值也是一個向量,且其長度與test_expression相同。
如果test_expression的對應(yīng)值為TRUE,則返回的向量具有x的元素,如果test_expression的對應(yīng)值為FALSE,則返回具有y的元素。
這就是說,如果test_expression是TRUE,結(jié)果的第i個元素將是x[i],否則它將取y[i]的值。
來看個例子:
> 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)。
后面兩個參數(shù)將自動擴充到相同長度,變?yōu)椋?("even", "even", "even", "even")和("odd", "odd", "odd", "odd")。因此當(dāng)test_expression的對應(yīng)值為TRUE時,會取"even",否則取"odd"。
3. for 循環(huán)
for循環(huán)用于遍歷向量中的所有元素。
其語法為:
for (val in sequence)
{
statement
}
這里的sequence是一個向量,而val在循環(huán)過程中依次取sequence中每個值。在每次迭代中,都會執(zhí)行statement語句。
其流程圖為:

下面是一個計算向量中偶數(shù)個數(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個元素,因此循環(huán)迭代了7次。
在每次迭代中,val取x對應(yīng)元素的值。
我們使用了一個計數(shù)器來計算x中偶數(shù)的個數(shù)。我們可以看到向量x包含3個偶數(shù)。
4. while 循環(huán)
在R中,while循環(huán)用于循環(huán)直到特定條件不滿足為止。
其語法為:
while (test_expression)
{
statement
}
如果test_expression的評估結(jié)果為TRUE,則進入到循環(huán)的主體。
執(zhí)行主體中的語句,執(zhí)行完后流程返回,再次評估test_expression。
重復(fù)此過程,直到test_expression評估結(jié)果為FALSE為止,循環(huán)退出。
其流程圖為:

看個例子:
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,因此評估為TRUE。因此,執(zhí)行了循環(huán)的主體打印i并遞增了i。
i的增加很重要,這樣最終將滿足退出循環(huán)條件。否則,將導(dǎo)致無限循環(huán)。
在下一次迭代中,i的值變?yōu)?code>2,循環(huán)繼續(xù)進行。
這將一直持續(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)(另一個循環(huán)內(nèi)的循環(huán))內(nèi),則break將只會終止最里面的循環(huán)。
其語法為:
if (test_expression) {
break
}
注意:break語句也可以在if...else語句的else分支內(nèi)使用。
其流程圖為:

來看個例子:
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語句時終止。
next 語句
next語句僅在當(dāng)前迭代時用于跳過循環(huán)內(nèi)的其余代碼。循環(huán)不會終止,會繼續(xù)進行下一個迭代。
其語法為:
if (test_condition) {
next
}
注意:next語句也可以在if...else語句的else分支內(nèi)使用。
其流程圖為:

來看個例子:
x <- 1:5
for (val in x) {
if (val == 3){
next
}
print(val)
}
輸出為:
[1] 1
[1] 2
[1] 4
[1] 5
在上面的示例中,我們在條件語句內(nèi)使用next語句來檢查該值是否等于3。
如果該值等于3,則當(dāng)前迭代停止,不會執(zhí)行后面的代碼,因此當(dāng)前不會打印值,但循環(huán)會繼續(xù)進行下一次迭代。
上述例子的結(jié)果反映了這種情況。
6. repeat 循環(huán)
repeat循環(huán)用于多次迭代代碼塊。
repeat循環(huán)中沒有條件檢查來退出循環(huán)。因此我們必須自己將一個條件顯式地放入循環(huán)體中,并使用break語句退出循環(huán)。如果不這樣做,將導(dǎo)致無限循環(huán)。
其語法為:
repeat {
statement
}
其流程圖為:

來看個例子:
x <- 1
repeat {
print(x)
x = x+1
if (x == 6) {
break
}
}
輸出為:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
在上面的示例中,我們使用了一個條件來檢查并在x取值為6時退出循環(huán)。
因此,我們在輸出中看到僅打印1到5的值。
今天的內(nèi)容就到此為止,介紹了R中的條件和循環(huán)語句,希望對大家有點幫助。
感謝您的閱讀!想了解更多有關(guān)技巧,請關(guān)注我的微信公眾號“R語言和Python學(xué)堂”,我將定期更新相關(guān)文章。
