R語言初級教程(22): 條件和循環(huán)語句

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_expressionTRUE,結(jié)果的第i個元素將是x[i],否則它將取y[i]的值。

來看個例子:

> a <- c(5, 7, 2, 9)
> ifelse(a %% 2 == 0, "even", "odd")
[1] "odd"  "odd"  "even" "odd" 

在上面的示例中,test_expressiona %% 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次。

在每次迭代中,valx對應(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_expressioni < 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中,可以使用breaknext語句更改正常的循環(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,該向量是從15的連續(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)。

因此,我們在輸出中看到僅打印15的值。

今天的內(nèi)容就到此為止,介紹了R中的條件和循環(huán)語句,希望對大家有點幫助。


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容